有三種友元宣告可以出現在類模板中:
1、非模板友元類或友元函式。在下面的例子中,函式foo()、成員函式bar()以及foobar類都是類模板queueitem的所有例項的友元。
class foo
;templateclass queueitem
;
上面的例子中,注意第三條,在queueitem類把foo類的乙個成員宣告為友元之前,foo類必須已經被定義。且乙個類成員只能由該類的定義引入。在foo的定義可見之前,queueitem不能引用foo::bar()。
2、繫結的友元類模板或函式模板。下列例子中,在類模板queueitem的例項和它的友元(也是模板例項)之間定義了一對一的對映。因為模板參數列中的引數是同乙個,都是type。對queueitem的每乙個型別的例項,foobar、foo()和queue::bar()的單個相關的例項都是友元。如下所示:
templateclass foobar ;
templatevoid foo(queueitem) ;
templateclass queue
;templateclass queueitem
;
在乙個模板可以被用在乙個類模板的友元宣告之前,它的宣告或定義必須先被給出。在我們的例子中,在queueitem類中的友元宣告之前,必須先宣告類模板foobar和queue,以及函式模板foo()。
foo()的友元宣告的語法看起來或許令人吃驚:
friend void foo(queueitem) ;
函式名後面緊跟著顯示的模板實參表:foo。這種語法可用來指定該友元宣告所引用的是函式模板foo()的例項。如果省略了顯示的模板實參,如下所示:
friend void foo(queueitem) ;
則友元宣告會別解釋為引用了乙個非模板函式,且該函式的引數型別是類模板queueitem的乙個例項。模板函式和同名的非模板函式可以共存。雖然在queueitem類的定義之前存在函式模板的宣告,但是這不會強迫友元宣告指向該模板。所以,我們必須為「引用函式模板例項的友元宣告」指示顯示的模板參數列。
3、非繫結的友元類模板或函式模板。在下面的例子中,在類模板queueitem的例項和其友元之間定義了一對多的對映。因為模板參數列中的引數是不一樣的。queueitem的引數是type,而其他的友元模板引數是t。對queueitem的每乙個型別的例項,foobar、foo()和queue::bar的所有例項都是友元。如下所示:
templateclass queueitem
;
模板類宣告友元函式
問題描述 如題,先看不報錯的 如 templateclass test template 2 void fun test data 因為需求傳遞需要函式指標,通過fun函式對類內私有成員進行操作。如果定義類內成員fun,則需要修改傳參。但是非要用友元函式怎麼辦呢。如果有1沒有2,則報錯 成員無法訪問...
模板類中的友元函式
模板類中友元函式不要濫用,最好只用來過載左移和右移運算子 和 如果用於普通友元函式過載,會非常麻煩,即使類模板定義和宣告分開,也建議都寫在.h或.hpp檔案中,即要保證模板類的定義和宣告在乙個檔案中,否則,將不能找到函式的定義,這和模板的二次編譯有關。參見官方的stl庫風格可知,它也遵循這一原則,即...
模板類的 友元模板函式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 include include usingnamespacestd template classt c...