#ifndef _widget_h_
#define _widget_h_
#include using namespace std;
templateclass widget
private:
t a_;
};#include"widget.h"
templateinline void accesswidget(const widget& w)
#endif
呼叫test_widget後,編譯將出現以下錯誤:
1>main.obj : error lnk2001: unresolved external symbol "void __cdecl accesswidget(class widgetconst &)" (?accesswidget@@yaxabv?$widget@h@@@z)
原因分析:
1、模板的定義檔案和宣告標頭檔案不要分開,目前來說,gcc和msvc80還都不支援分開。
2、這個問題屬於模板friend函式問題,不能簡單地將宣告與定義分開,然而即使放在同乙個檔案,編譯也會報錯的。
解決辦法:
1、最直接的辦法是將函式的定義放在宣告的地方,目前大部分的編譯器都支援。有些人可能會採用將友元函式定義的cpp檔案改為inl檔案,然後在h標頭檔案尾部包含inl檔案的方法來實現,但事實上這樣做依然無法編譯。
2、另外一種辦法較為麻煩,並且有的編譯器還不一定支援;需要預先宣告模板類和友元函式,以及在類中友元函式宣告時候加以特化處理,以上**修改如下就可以順利通過編譯:
#ifndef _widget_hpp_
#define _widget_hpp_
#include using namespace std;
//預先宣告 widget
templateclass widget;
//預先宣告accesswidget
templatevoid accesswidget(const widget& w);
templateclass widget
private:
t a_;
};templateinline void accesswidget(const widget& w)
#endif
模板類宣告友元函式
問題描述 如題,先看不報錯的 如 templateclass test template 2 void fun test data 因為需求傳遞需要函式指標,通過fun函式對類內私有成員進行操作。如果定義類內成員fun,則需要修改傳參。但是非要用友元函式怎麼辦呢。如果有1沒有2,則報錯 成員無法訪問...
關於類模板的友元函式
問題始於學習資料結構,自己編寫乙個單鏈表,其中用到了過載輸出運算子 我寫的大約這樣 1 template class list 後來上網查改為 1 template class list 就可以了。不知所以然,查了下 c primer 才弄明白。在類模板中可以出現三種友元宣告 1 普通非模板類或函式...
類模板中的友元宣告
有三種友元宣告可以出現在類模板中 1 非模板友元類或友元函式。在下面的例子中,函式foo 成員函式bar 以及foobar類都是類模板queueitem的所有例項的友元。class foo templateclass queueitem 上面的例子中,注意第三條,在queueitem類把foo類的乙...