何らかの形で部分テンプレート仕様をフレンドクラスにすることは可能ですか?私。あなたは今、あなたは私が達成したい何のポインタC++テンプレート:部分テンプレート仕様とフレンドクラス
template <class T> class X<T*>{
T* t;
};
ための例えば部分的特殊化を、持っている以下のテンプレートクラス
template <class T> class X{
T t;
};
を持って考えることは、すべての可能なX<T*>
がANYのX<S>
のフレンドクラスであるということですS
。私。 X<A*>
はX<B>
の友人になるはずです。もちろん
、私はXにおける通常のテンプレートfriend宣言について考えた:
template <class T> class X{
template <class S> friend class X<S*>;
}
しかし、これはコンパイルされません、私にこのことを伝え++ G:
test4.cpp:15:34エラー: 'template<class T> class X
' の専門は、名前空間スコープで現れなければならない
test4.cpp:34:21:エラー:一部の専門 'X<S*>
' は「友達の
これはまったく不可能なのでしょうか、それとも回避策がありますか?
私が求めていた理由は、私は(T
のサブタイプでなければなりませんS
)任意X<S>
からこのクラスを作成しますX<T*>
でコンストラクタを必要とするということです。
コードは次のようになります。
template <class T> class X<T*>{
T* t;
template<class S>
X(X<S> x) : t(&(x.t)) {} //Error, x.t is private
}
を今、コンパイラはそれがプライベートであるため、x.t
はコンストラクタでvisibileではないことを、当然のことながら、文句を言います。これが私が部分的な専門化の友達クラスを必要とする理由です。
'get'関数は本当に質問から外れていますか?これは私にとってはよりクリーンで、テンプレートの友人の狂気をすべて避けているようです。 – pmr
この例ではおそらく動作します。しかし、公開されてはならないデータがありますが、テンプレートの特殊化のみが可能です。問題は何とかこの動作が可能かどうかです。 – gexicide