C 中模板類使用友元模板函式

2022-05-30 11:27:11 字數 1111 閱讀 8585

在類模板中可以出現三種友元宣告:

(1)普通非模板類或函式的友元宣告,將友元關係授予明確指定的類或函式。

(2)類模板或函式模板的友元宣告,授予對友元所有例項的訪問權。

(3)只授予對類模板或函式模板的特定例項的訪問權的友元宣告。

要注意的是,友元函式並非成員函式,是改變了它對類成員的訪問許可權。

(1)沒有什麼好說的,如:

template

class a;

此例中fun可訪問a任意類例項中的私有和保護成員

(2)template

class a;

按(2)可改為:

template class list;

在這裡其實兩者實現的最終效果一樣的,因為呼叫輸出運算子時需要訪問的類例項的物件是它本身,所以形參t在第一種改法中一定匹配。

對類建立友元函式很容易。但是遷移到模板上卻容易出現讓人摸不著頭腦的連線錯誤。

層次不夠,不做分析,單純介紹兩種為類模板定義友元函式的方法。

1 封閉型

template< typename t >

class

myclass

};

2、開放型

template

class

a;

這時友元使用與類不同的模板形參,t可以是任意合法標誌符,友元函式可以訪問a類的任何類例項的資料,即不論a的形參是int,double或其他都可以。

3、告訴編譯器宣告的是個模板

template

class

a;

此時fun只有訪問類中特定例項的資料。換句話說,此時具有相同模板實參的fun函式與a類才是友元關係。即假如呼叫fun時其模板實參為int,則它只具有a的訪問許可權。當然friend void fun(t u);中<>中的t可以是任意型別,比如int,double等

要點:顯示地在過載的運算子或者函式後面加上模板宣告< t >,告訴編譯器友元函式是乙個型別一致的模板。

建議:如果希望使用函式與模板特化的型別相對應,則使用方法3(模板顯示宣告)

如果希望使用函式與模板特化的型別相獨立,則使用方法2(二重模板)

簡短的內聯函式使用方法1

linux中模板類使用友元函式

linux中模板類使用友元函式時注意 1.在linux下不僅要在類裡面宣告函式,注意類中友元函式前不要定義模板類,直接在函式名後面加 friend ostream operator ostream os,test1 t 2.在類外面也需要宣告友元函式 包括過載函式 並且前面需要定義模板類 pragm...

C 中的模板(類模板 模板類 模板函式)

1 class 一般class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別 2 typename 為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號為乙個型別...

模板類的 友元模板函式

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...