2013-01-21 205 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中的致電完全匹配。該聲明是編譯器需要檢索它的所有內容,因此它編譯得很好,但鏈接器找不到定義,因爲您從來沒有定義它。