模板類中的友元函式

2021-08-15 19:21:20 字數 1395 閱讀 1164

模板類中友元函式不要濫用,最好只用來過載左移和右移運算子("<<"和">>"),如果用於普通友元函式過載, 會非常麻煩,即使類模板定義和宣告分開,也建議都寫在.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...