怎樣把函式模板宣告為類模板的友元

2021-06-16 21:22:06 字數 1649 閱讀 8289

怎樣把函式模板宣告為類模板的友元

給類模板宣告友元的函式模板有三種方式,分別為:

第一種方式,在模板類內部宣告友元的函式模板

第二種方式,在模板類內部宣告對應版本的友元函式模板例項化

需要前置宣告

這種方式是最為合理的方式

第三種方式,在模板類內部直接宣告友元函式,不涉及函式模板

這種情況只能在模板類內部一起把函式的定義寫出來,不能在外部實現,因為外部需要型別引數,而需要型別引數就是模板了

其實這種情況相當於一般的模板類的成員函式,也就是相當於乙個函式模板

第二種方式也是乙個函式模板,他們保持函式的引數型別和該模板類的例項乙個型別

第一種方式更為靈活,他不會要求引數型別與模板類例項是乙個型別,但是一般情況下我們也是按照乙個型別使用的。

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由於資料型別不一樣,需要做兩個棧才能滿足需求,誠然可以使用函式過載,但是終歸棧的操作是一樣的,只是資料型別不一樣。所以在此基礎上,假設,我們首先將所有的資料型別視為乙個大類,將它引數化,等到要用的時...