非テンプレートクラスのメンバーテンプレート関数の特殊インスタンスを作成するのに問題がありました。たとえば、テンプレートメンバー関数Fを持つクラスAがあります。
class A
{public:
template <class T> int F (T arg) const;
....
}
タイプBのこのテンプレート関数Fの特別なインスタンスが必要です。
class B;
...
template <> void A::F (B arg) const //GOOD!
そして、Bがテンプレート自体であるように見えるまで、それは完全に機能します!
このコード
template <class T> class B ...
...
template <> void A::F (B<T> arg) const //error, T undeclared
と同様
template <class T> class B ...
...
template <class T> template <> void A::F (B<T> arg) const //error, too many templates
コンパイルエラーが発生します。
2番目の問題は、この特別なインスタンス(またはテンプレートインスタンス全体)をクラスBのフレンド関数として宣言する方法です。(Bがテンプレートでなくても機能しません)。
class B
{friend template <> void A::F (B arg) const // error
// as well as
template <> friend void A::F (B arg) const // error
}
私がやろうとしている方法でコードを書く方法はありますか、それとも不可能ですか?