11

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
4

2 に答える 2