關於模板類中友元函式的宣告與定義

2021-06-20 02:45:19 字數 1170 閱讀 7651

#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類的乙...