函数模板的隐式实例化

时间:2013-01-21 15:12:48

标签: c++ templates

我有以下代码,我只是为了练习功能模板而设想的。

#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

我理解好类模板,但我仍然对功能模板感到困惑。

2 个答案:

答案 0 :(得分:5)

将朋友声明更改为:

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

或者:

friend A fun<A>( const A & );

答案 1 :(得分:0)

在过载重新分配期间,正常功能优先于功能模板。 A内的免费朋友功能声明与main中的通话完全匹配。声明是编译器需要拾取它的所有声明,因此它编译得很好,但是链接器找不到定义,因为你从来没有定义它。