模板類中友元函式不要濫用,最好只用來過載左移和右移運算子("<<"和">>"),如果用於普通友元函式過載, 會非常麻煩,即使類模板定義和宣告分開,也建議都寫在.h或.hpp檔案中,即要保證模板類的定義和宣告在乙個檔案中,否則,將不能找到函式的定義,這和模板的二次編譯有關。參見官方的stl庫風格可知,它也遵循這一原則,即類模板的定義和宣告都寫在乙個檔案中,由於包含類模板定義,檔案字尾理應為.cpp,但使用模板又要#include此cpp檔案,所以業界一般將字尾改為.hpp。
complex.hpp檔案
#pragma once
#include #include using namespace std;
//非運算子過載的友元函式如果將定義和宣告分開寫的話,必須要進行以下四句宣告,
//否則出錯(運算子過載的友元函式除外),所以不建議濫用友元函式,特別是在類模板中
//一般我們的使用原則是除了過載左移和右移運算子,不要用其他型別的友元函式
template class complex;
templatecomplexsubcom(const complex&obj1, const complex&obj2);
template class complex
;templatecomplex::complex(t i, t j) :i(i), j(j)
templatevoid complex::printcomplex()
templatecomplexcomplex::operator+(complex& obj)
templateostream & operator<<(ostream &out, const complex& obj)
//濫用 友元函式
template complexsubcom(const complex&obj1, const complex&obj2)
/*請注意最重要的兩句:
1、除了左移和右移運算子過載不要使用其他友元函式
2、即使類模板的定義和宣告分開來寫,也要放在同乙個檔案中,建議都放在.h或者.hpp檔案中(官方的stl模板都是這麼做的)
*/
注意第23,24行友元函式宣告的寫法,所放的位置,否則模板類的二次編譯會導致編譯出錯
main.cpp檔案
#include #include "complex.hpp"
using namespace std;
int main()
執行結果
1 + 2i
2 + 3i
3 + 5i
1 + 2i
2 + 3i
3 + 5i
-1 + -1i
請按任意鍵繼續. . .
模板類的 友元模板函式
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...
模板類的 友元模板函式
模板類的 友元模板函式 第二名 12 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 te...
模板類中的友元函式寫法
1.友元函式在類的定義體中實現。using namespace std template class queue private size t length include queue.cpp endif queue h 2.友元函式在類中宣告在cpp檔案中實現 ifndef queue h def...