どういうわけか部分的なテンプレート仕様をフレンドクラスにすることは可能ですか?つまり、次のテンプレートクラスがあると考えてください
template <class T> class X{
T t;
};
これで、たとえばポインタの部分的な特殊化ができました
template <class T> class X<T*>{
T* t;
};
私が達成したいのは、可能な限りすべてのX<T*>
人の友達クラスであるということです。つまり、の友達である必要があります。X<S>
S
X<A*>
X<B>
もちろん、私はXでの通常のテンプレートフレンド宣言について考えました。
template <class T> class X{
template <class S> friend class X<S*>;
}
ただし、これはコンパイルされません。g++は次のように通知します。
test4.cpp:34:15:エラー:' template<class T> class X
'の特殊化は名前空間スコープに表示される必要があります
test4.cpp:34:21:エラー:部分的な特殊化' X<S*>
'宣言された'友達'
これはまったく不可能ですか、それとも回避策がありますか?
私が尋ねている理由はX<T*>
、任意のクラスからこのクラスを作成するコンストラクターが必要だからですX<S>
(S
のサブタイプでなければなりません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
それがプライベートであるため、コンストラクターでは見えないという不満を言います。これが、部分的な専門の友達クラスが必要な理由です。