2012-06-07 154 views
1

論壇上有很多關於朋友和模板的主題。我特意查這一個位置: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16朋友和模板C++

但是關於這裏一個段落有些迷惑:

當編譯器看到好友線路中的 類定義正確的方法了障礙發生。那時它還不知道朋友功能本身就是模板;它假定他們是 非模板是這樣的:

Foo<int> operator+ (const Foo<int>& lhs, const Foo<int>& rhs) 
{ ... } 

std::ostream& operator<< (std::ostream& o, const Foo<int>& x) 
{ ... } 

我必須承認,我不知道很多關於編譯器技術。我很困惑,這裏要說的是,爲什麼這樣一個類內部的說法是不充分的理由的函數operator +是一個模板函數?:

friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs); 

它有一個模板參數T和三角支架... 我試圖去思考除了模板函數以外還有哪些其他類型。但是無法通過這個理解我的想法。

我也對編譯器做出的假設感到困惑。爲什麼它特定選擇< int>?爲什麼編譯會做出這個假設,但不是模板函數 - 這對我來說似乎更合理。

非常感謝,

+0

雖然它不是一個真正的回答你的問題,你可能會發現這個有用:http://yosefk.com/c++fqa/templates.html#fqa-35.16 –

+0

它選擇''因爲在這個例子中,實例化在'T == int'上:'Foo lhs(1);' – dyp

+0

謝謝DyP。我忽視了主要。 –

回答

1

每當你在類中聲明友元函數,這是模板(之前聲明),你必須信號編譯器,聲明的函數是模板放置空尖括號或通過限定它例如:

http://ideone.com/kmIfc

如果你不這樣做,要麼隨後宣佈友元函數應該作爲新功能的聲明,如果沒有以前的聲明ñ模板上的功能。

http://ideone.com/woIgn

+0

標準,14.5.3/1點1和3對模板朋友聲明的解釋:1)帶有<>的版本,即模板id。 3)您自己專門定製功能模板的版本(在朋友聲明之前)。列表中的第4點允許聲明新的非模板[!]功能。 – dyp