在類模板中可以出現三種友元宣告:
(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、開放型
templateclass
a;
這時友元使用與類不同的模板形參,t可以是任意合法標誌符,友元函式可以訪問a類的任何類例項的資料,即不論a的形參是int,double或其他都可以。
3、告訴編譯器宣告的是個模板
templateclass
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...