STL原始碼剖析 模板類中的友元函式

2021-04-29 20:13:15 字數 836 閱讀 1143

先看個**:

#include

using namespace std;

template

class a

;template

bool operator==(const a&, const a&)

int _tmain(int argc, _tchar* argv)

編譯-執行皆無問題。

但是,把#include

using namespace std;去掉後編譯出錯,何解?

初次猜測總不至於list和std裡有什麼貓膩吧,後來細細想來,原來是這樣。來看另外的**:

template

bool operator==(const t&, const t&);

template

class a

;template

bool operator==(const a&, const a&)

int _tmain(int argc, _tchar* argv)

編譯執行皆無問題,哈哈,發現問題所在了吧,必須在模板類宣告此友元函式之前必須要有這個函式的宣告,不然編譯器不認。而在list std裡可能就有了如紅色標明的全域性的==過載宣告,以致於在不自覺中宣告了函式,呵呵。

note:只有在模板類中宣告友元時,如果不在宣告時定義的話,你就必須在之前給這函式進行宣告。但是如果不是模板類的話則不需要預先宣告。**如下:

class c

;void func(const c& c)

int _tmain(int argc, _tchar* argv)

{func(c()); // ok ,not error

類模板中的友元宣告

有三種友元宣告可以出現在類模板中 1 非模板友元類或友元函式。在下面的例子中,函式foo 成員函式bar 以及foobar類都是類模板queueitem的所有例項的友元。class foo templateclass queueitem 上面的例子中,注意第三條,在queueitem類把foo類的乙...

模板類中的友元函式

模板類中友元函式不要濫用,最好只用來過載左移和右移運算子 和 如果用於普通友元函式過載,會非常麻煩,即使類模板定義和宣告分開,也建議都寫在.h或.hpp檔案中,即要保證模板類的定義和宣告在乙個檔案中,否則,將不能找到函式的定義,這和模板的二次編譯有關。參見官方的stl庫風格可知,它也遵循這一原則,即...

模板類的 友元模板函式

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