2011-08-07 70 views
1
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有什麼區別?兩種聲明模板好友類的方法?

+0

你的意思是模板類BAR2 { 模板友元類FooBar的; }; ? – Shash316

+0

@ Shash316,在通過編譯器之前,我直接從vs2008中複製了代碼。 – q0987

回答

8

根據我的編譯器,你的第二個語法是無效的。如果將它們更改爲:

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是朋友。

+0

@ q0987:僅僅因爲Visual Studio(或任何編譯器)接受它並沒有使它成爲有效的語法。 –

+0

@ q0987我剛剛檢查了Visual Studio 2010,我的假設是否正確,顯然是這樣。有人告訴我,這是不是VS。關於在VS 2008中的編譯,一些編譯器接受的代碼不是有效的C++。我知道這很奇怪,但這是事實。 –

+0

@尼科爾,我完全同意你在這一點上。但我仍然需要一個堅實的答案來解決我的問題。 – q0987

1

如果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