在c++海大本科課程設計的最後章節(模板使用 )中涉及到了在Mat類模板中定義友元函數friend Mat
聲明在類中進行如上的聲明,定義在類外進行模板函數的定義,鏈接報錯:
error LNK2001: 無法解析的外部符號 "class Mat
1>D:\Installation Package\VC6cn\MyProjects\overload_abstract_template\template\Debug\template.exe : fatal error LNK1120: 1 個無法解析的外部命令
對在類模板中的友元函數operator+聲明前加上一句:template< typename T> 就可以正常運行了,那麼究其原因,下面對類模板的友元函數進行了總結整理:
在類模板中可以出現三種友元聲明:
(1)普通非模板類或函數的友元聲明,將友元關系授予明確指定的類或函數。
(2)類模板或函數模板的友元聲明,授予對友元所有實例的訪問權。
(3)只授予對類模板或函數模板的特定實例的訪問權的友元聲明。
要注意的是,友元函數並非成員函數,是改變了它對類成員的訪問權限。
(1)沒有什麼好說的,如:
template
class A{
//...
};
此例中fun可訪問A任意類實例中的私有和保護成員
(2)
template
class A{
//...
};
這時友元使用與類不同的模板形參,T可以是任意合法標志符,友元函數可以訪問A類的任何類實例的數據,即不論A的形參是int,double或其他都可以。
(3)
template
class A{
//...
};
此時fun只有訪問類中特定實例的數據。換句話說,此時具有相同模板實參的fun函數與A類才是友元關系。即假如調用fun時其模板實參為int,則它只具有A
回到原問題,按(3)可改為:
template
};
按(2)可改為:
template
};
在這裡其實兩者實現的最終效果一樣的,因為調用輸出運算符時需要訪問的類實例的對象是它本身,所以形參T在第一種改法中一定匹配。
對類建立友元函數很容易。但是遷移到模板上卻容易出現讓人摸不著頭腦的連接錯誤。
層次不夠,不做分析,單純介紹兩種為類模板定義友元函數的方法
1 封閉型