2014-01-10 8 views
7
template<typename... TArgs> struct List { }; 
template<template<typename...> class> struct ListHelper; 
template<typename T, typename... TArgs> struct ListHelper<List<T, TArgs...>> { }; 
                 ^
    /*Error: Template argument for template template parameter 
      must be a class template or type alias template*/ 

何が問題なのですか?私はclang ++ SVNを使用しています。"テンプレートテンプレートパラメータのテンプレート引数はクラステンプレートまたはエイリアステンプレートでなければなりません"

+0

が必要と思いれる

template<typename T, typename... TArgs> struct ListHelper<List> { }; // only the template itself ^^^^ 

あなたがList<T,TArgs...>を渡したい場合は、何のエラーを示し、またはテンプレートが既に含めることによって失敗しないテンプレートのインスタンス化? –

+0

@πάνταῥεinstantインスタンス化はありません。これは文字通りプログラム内のすべてのコードです( 'int main(){return 0;}'を除く) –

+4

私はこのエラーメッセージが大好きです。 – Casey

答えて

11

テンプレートテンプレートパラメータがあります。テンプレートを引数として渡す必要があります。代わりにテンプレートのインスタンス化を引数として渡します。これは具体的なクラスであり、テンプレートではありません(すべてのパラメータがバインドされています)。

は考えてみましょう:

template <template<typename> typename X> 
class WantsTemplate {}; 

template <typename> 
class ATemplate {}; 

WantsTemplate<ATemplate> wt1; // OK 
WantsTemplate<ATemplate<int> > wt2; // not OK 
1

テンプレートテンプレートパラメータは、テンプレートではなく、それのインスタンス化を期待しています。この:クラスは、あなたが

template<typename T> struct ListHelper; 
関連する問題