template<typename T> class FooBar {};
template<typename T> class Bar {
friend class FooBar<T>;
};
template<typename T> class Bar2 {
template friend class FooBar<T>;
};
class bar和bar2有什麼區別?兩種聲明模板好友類的方法?
template<typename T> class FooBar {};
template<typename T> class Bar {
friend class FooBar<T>;
};
template<typename T> class Bar2 {
template friend class FooBar<T>;
};
class bar和bar2有什麼區別?兩種聲明模板好友類的方法?
根據我的編譯器,你的第二個語法是無效的。如果將它們更改爲:
template<typename T> class FooBar {};
template<typename T> class Bar {
friend class FooBar<T>;
};
template<typename T> class Bar2 {
template<typename T2> friend class FooBar;
};
然後它會編譯。區別在於在Bar<T>
中,只有FooBar<T>
是朋友;如果您有Bar<int>
,只有FooBar<int>
是朋友,而不是FooBar<char>
或任何其他類型,但int
。在Bar2<T>
中,任何類型的FooBar
是朋友。
@ q0987:僅僅因爲Visual Studio(或任何編譯器)接受它並沒有使它成爲有效的語法。 –
@ q0987我剛剛檢查了Visual Studio 2010,我的假設是否正確,顯然是這樣。有人告訴我,這是不是VS。關於在VS 2008中的編譯,一些編譯器接受的代碼不是有效的C++。我知道這很奇怪,但這是事實。 –
@尼科爾,我完全同意你在這一點上。但我仍然需要一個堅實的答案來解決我的問題。 – q0987
如果BAR2類定義被修改,像下面
template<typename T> class Bar2 {
template<typename U> friend class FooBar<U>;
};
然後,anytype類型FooBar的是朋友anytype類型BAR2的。
然而Bar類的定義告訴T類型的FooBar與Bar類型相同的朋友。即酒吧<焦炭> & FooBar的<字符>,而不是酒吧< int>的& FooBar的<焦炭>
詞shash
你的意思是模板類BAR2 { 模板友元類FooBar的; }; ? –
Shash316
@ Shash316,在通過編譯器之前,我直接從vs2008中複製了代碼。 – q0987