どういうわけか部分的なテンプレート仕様をフレンドクラスにすることは可能ですか?つまり、次のテンプレートクラスがあると考えてください
template <class T> class X{
T t;
};
これで、たとえばポインタの部分的な特殊化ができました
template <class T> class X<T*>{
T* t;
};
私が達成したいのは、可能な限りすべてのX<T*>人の友達クラスであるということです。つまり、の友達である必要があります。X<S>SX<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それがプライベートであるため、コンストラクターでは見えないという不満を言います。これが、部分的な専門の友達クラスが必要な理由です。