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つの方法はありますか?
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つの方法はありますか?
私のコンパイラによると、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
もフレンドです。
@ 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>;
};
の下のように変更された場合、その後、FooBarののANYTYPEはBAR2のANYTYPEと友達です。
しかし、Barクラスの定義では、タイプTのFooBarは、同じタイプのBarのフレンドです。すなわち、バー<のchar> & FooBarの<のchar>・バーではない<整数> & FooBarの<のchar>
Shash
テンプレートにクラスBAR2を意味するか{ テンプレートフレンドクラスFooBarの。 }; ? –
Shash316
@ Shash316、私は直接コンパイラを渡す前にvs2008からコードをコピーしました。 – q0987