2013-01-21 155 views
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 

我的理解以及类模板,但我仍然感到困惑的函数模板。

回答

5

变化朋友声明:

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

或邮寄至:

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

+1为“或”。第二个匹配原始意图。 – Angew

+0

如果你只是增加了两者之间的区别,以及它们与隐式和显式专业化思想之间的关系如何,我会很感激。谢谢。 – yauser

+0

此外,我认为给定模板声明,编译器可以从调用的上下文中猜测专业化,我不必提供函数源自模板的任何信息。友谊宣言是否强化了特殊待遇,还是我混淆了事物? – yauser

0

正常功能超负荷resoulution期间超过者优先函数模板。 A中的免费好友功能声明与main中的致电完全匹配。该声明是编译器需要检索它的所有内容,因此它编译得很好,但链接器找不到定义,因为您从来没有定义它。