2 つのテンプレート パラメータを持つテンプレート化されたクラスがあります。
template <class T, class U> class A /* ... */
テンプレート パラメーターとして 2 つの引数を持つテンプレート クラスを受け入れる別のテンプレート クラス。
template <class T, class U, template<class X, class Y> class Z>
class B
{
typedef typename Z<T,U>::pointer pointer;
};
ZがAの場合、AにBのインスタンスを作成することは不可能ですか?
template <class T, class U>
class A
{
public:
B<T,U,A> foo (void) // compiler complaining here
{
B<T,U,A> test; // and here
return test;
}
};
同じことをする無料の関数はまったく問題ありません。
template<class T, class U>
B<T, U, A> bar (void)
{
B<T,U,A> test;
return test;
}
言い換えれば、私が今いるクラスの名前をテンプレート引数として使用することを妨げる、まだ失敗していないルールはありますか?
コードは次のとおりです。
template <class T, class U, template<class X, class Y> class Z>
class B
{
typedef typename Z<T,U>::pointer pointer;
};
template <class T, class U>
class A
{
public:
B<T,U, A> foo (void)
{
B<T,U,A> test;
return test;
}
};
template<class T, class U>
B<T, U, A> bar (void)
{
B<T,U,A> test;
return test;
}
int main (void)
{
return 0;
}
また、MSVC 2012 コンパイラはCompiler Error 3200を返します。
'A<T,U>' : invalid template argument for template parameter 'Z', expected a class template