2017-11-16 8 views
1

入れ子のテンプレートクラスを取得しようとしています。
コンパイラは私に次のエラーを与える:入れ子のテンプレートクラス

error: type/value mismatch at argument 1 in template parameter list for ‘template class MyClass’ note: expected a class template, got ‘SpecificType {aka TemplateClass< Type1, Typ2, Type3 >}

は、これは私のコード

/* ...class definition... */ 
template < template < typename T1,typename T2,typename T3 > typename T> 
class MyClass{ 
    // is there a way to have these types available here 
    // passing one single specialized type in the main? 
    T1 member1; 
    T2 member2; 
    T3 member3; 
    T<T1, T2, T3> member4; 
}; 

/* ...in my main... */ 
using SpecificType = TemplateClass< Type1, Type2, Type3 >; 
SpecificType test_object; //until here compiles 
MyClass<SpecificType> myclass; 

である私はすでにSpecificTypeオブジェクトを定義しようとしましたが、その時点までに私のコードはコンパイルして動作します。

+1

'SpecificType'はもうtempalteではありません(あなたは' TemplateClass'にパラメータを渡しています)。 'MyClass 'は細かいものでなければなりません。 – user463035818

答えて

3

MyClassは、テンプレートではなくパラメータとしてテンプレートを受け入れるために定義します。このため、テンプレートを渡すだけです。 TemplateClassそれ自身。

あなたの定義によれば、私はそれ自身が3つのテンプレートパラメータを持つテンプレートを持ちたいと思っています。したがって、テンプレートのインスタンスではなく、テンプレートを渡す必要があります。

/* ...class definition... */ 
template < template < typename T1,typename T2,typename T3 > typename T> 
class MyClass{ /*...*/}; 

template <typename T1, typename T2, typename T3> 
class TemplateClass {}; 

/* ...in my main... */ 
int main() 
{ 
    MyClass<TemplateClass> myclass; 
} 

あなたのクラスにテンプレートを通過した後、クラスの中あなたはそれが好きでインスタンス化するテンプレートを使用することができます。

template < template < typename T1,typename T2,typename T3 > typename T> 
class MyClass 
{ 
    T<int, float, char> obj; 
}; 

あなたのコメントを取得した後、あなたは別のことをしたいです!型を渡したい場合、ここではテンプレートのインスタンスが必要です。だから、単純に次の操作を行います

/* ...class definition... */ 
template < typename T> 
class MyClass 
{ 
    T obj; 
}; 

template <typename T1, typename T2, typename T3> 
class TemplateClass {}; 

int main() 
{ 
    MyClass< TemplateClass< int, float, char> > myclass; 
} 

そして今、型を渡すことが可能である:-)

OPからの第2の要求(例えば、ここで私たちがインスタンス化されたテンプレートを参照)を取得し、タイプを取得しますテンプレートパラメータからここをクリックしてください:

template < typename T> 
class MyClass; 

template < template < typename ,typename ,typename > typename T, typename T1, typename T2, typename T3> 
class MyClass< T<T1,T2,T3> > 
{ 
    T1 var1; // here you can use the types... 
    T2 var2; 

    T<T1,T2,T3> obj; 
}; 

template <typename T1, typename T2, typename T3> 
class TemplateClass {}; 

int main() 
{ 
    MyClass< TemplateClass< int, float, char> > myclass; 
} 
+0

ニックピッキング:「テンプレートのインスタンス」という言葉についてはわかりません。厳密に言えば、テンプレートのインスタンスはありません(オブジェクトの意味でインスタンス...私はあなたが意味することを知っていますが、それでも誤解される可能性があります)。提案: "具体的なタイプ(テンプレートをインスタンス化した結果)"に置き換えてください(より具体的には "インスタンス化"の意味を意味します) – user463035818

+0

答えをありがとう。あなたは最初の部分で正しいです。 2番目の部分、つまりインスタンス化では、特定の型を認識する必要があるように見えます。 ** MyClass **が私の図書館にあるとしましょう。私はその図書館の外の種類を指定したいと思います。どうすればそれらを渡すことができますか? –

+0

@BartoloDellaCorte単にテンプレートを要求する代わりに、 'MyClass'がテンプレートを必要とせずに、tempalteパラメータとして型を受け入れるようにしてください。 – user463035818