我有以下代码,我只是为了练习功能模板而设想的。
#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
我理解好类模板,但我仍然对功能模板感到困惑。
答案 0 :(得分:5)
将朋友声明更改为:
template <class T> friend T fun( const T & );
或者:
friend A fun<A>( const A & );
答案 1 :(得分:0)
在过载重新分配期间,正常功能优先于功能模板。 A
内的免费朋友功能声明与main
中的通话完全匹配。声明是编译器需要拾取它的所有声明,因此它编译得很好,但是链接器找不到定义,因为你从来没有定义它。