2011-08-07 8 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>; 
}; 

クラスバーとバー2の違いは何ですか?テンプレート友人クラスを宣言する2つの方法はありますか?

+0

テンプレートにクラスBAR2を意味するか{ テンプレートフレンドクラスFooBarの。 }; ? – Shash316

+0

@ Shash316、私は直接コンパイラを渡す前にvs2008からコードをコピーしました。 – q0987

答えて

8

私のコンパイラによると、2番目の構文は無効です。変更する場合:

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>; 
}; 

の下のように変更された場合、その後、FooBarののANYTYPEはBAR2のANYTYPEと友達です。

しかし、Barクラスの定義では、タイプTのFooBarは、同じタイプのBarのフレンドです。すなわち、バー<のchar> & FooBarの<のchar>・バーではない<整数> & FooBarの<のchar>

Shash

関連する問題