怎樣把函式模板宣告為類模板的友元
給類模板宣告友元的函式模板有三種方式,分別為:
第一種方式,在模板類內部宣告友元的函式模板
第二種方式,在模板類內部宣告對應版本的友元函式模板例項化
需要前置宣告
這種方式是最為合理的方式
第三種方式,在模板類內部直接宣告友元函式,不涉及函式模板
這種情況只能在模板類內部一起把函式的定義寫出來,不能在外部實現,因為外部需要型別引數,而需要型別引數就是模板了
其實這種情況相當於一般的模板類的成員函式,也就是相當於乙個函式模板
第二種方式也是乙個函式模板,他們保持函式的引數型別和該模板類的例項乙個型別
第一種方式更為靈活,他不會要求引數型別與模板類例項是乙個型別,但是一般情況下我們也是按照乙個型別使用的。
1#include
<
iostream
>
2using
namespace
std;34
//// 第一種方式,在模板類內部宣告友元的函式模板5//
template 6//
class c7//
;14//15
//template
16//
void foo(const c& t)
17//
22//}23
24//
第二種方式,在模板類內部宣告對應版本的友元函式模板例項化
25//
需要前置宣告
26//
這種方式是最為合理的方式
27template
<
typename t
>
28class
c;29
30template
<
typename t
>
31void
foo(
const
c<
t>&
t);32
33template
<
typename t
>
34classc35
;4142template
<
typename t
>
43void
foo(
const
c<
t>&
t)4449}
5051
//// 第三種方式,在模板類內部直接宣告友元函式,不涉及函式模板
52///
/ 這種情況只能在模板類內部一起把函式的定義寫出來,不能在外部實現,因為外部需要型別引數,而需要型別引數就是模板了
53///
/ 其實這種情況相當於一般的模板類的成員函式,也就是相當於乙個函式模板
54///
/ 第二種方式也是乙個函式模板,他們保持函式的引數型別和該模板類的例項乙個型別
55///
/ 第一種方式更為靈活,他不會要求引數型別與模板類例項是乙個型別,但是一般情況下我們也是按照乙個型別使用的。
56//
template
57//
class c
58//
68//}69
//};
7071
intmain()
72
關於函式模板在類模板中宣告為友元的一些心得
用類模板設計時,有時需要在類定義中宣告友元函式,比如過載輸出操作符 而當友元函式是模板函式時,則需要滿足一些宣告和定義的規則。如,當我編寫乙個順序錶類模板時,加入了過載 的友元模板如下 template class seqlist 此時在main.cpp檔案中定義operator 如下 templa...
模板類宣告友元函式
問題描述 如題,先看不報錯的 如 templateclass test template 2 void fun test data 因為需求傳遞需要函式指標,通過fun函式對類內私有成員進行操作。如果定義類內成員fun,則需要修改傳參。但是非要用友元函式怎麼辦呢。如果有1沒有2,則報錯 成員無法訪問...
模板 函式模板 類模板
模板主要是針對資料型別,不同的資料型別卻具有相同的操作形式,比如說,同樣是做入棧,int和double由於資料型別不一樣,需要做兩個棧才能滿足需求,誠然可以使用函式過載,但是終歸棧的操作是一樣的,只是資料型別不一樣。所以在此基礎上,假設,我們首先將所有的資料型別視為乙個大類,將它引數化,等到要用的時...