3

関数テンプレートを練習するためだけに考えた次のコードがあります。

#include <iostream>

template <typename T>
T fun( const T &t ) { return t; }

struct A {
    int dataf;
    A( int a ) : dataf(a) { std::cout << "birth\n"; }
    friend A fun( const A & );
};

int main(){
    A a( 5 );
    fun( a );   
    return 0;
}

次のエラーが表示されますが:

code.cc:(.text+0x32): undefined reference to `fun(A const&)'
collect2: ld returned 1 exit status

クラス テンプレートはよく理解していますが、関数テンプレートについてはまだ混乱しています。

4

2 に答える 2

6

フレンド宣言を次のように変更します。

template <class T> friend T fun( const T & );

または:

friend A fun<A>( const A & );
于 2013-01-21T15:13:41.100 に答える
0

オーバーロードの解決中は、関数テンプレートよりも通常の関数が優先されます。内部のフリー フレンド関数の宣言は、Aの呼び出しと完全に一致しmainます。宣言は、コンパイラがそれを取得するために必要なすべてであるため、正常にコンパイルされますが、定義を定義したことがないため、リンカは定義を見つけることができません。

于 2013-01-21T15:19:10.967 に答える