2017-11-19 19 views
1

「C++ Templates、The Complete Guide」の第5章を読んでいます。「テンプレートテンプレート」テンプレートの概念を見てきました。テンプレートクラスでテンプレートテンプレートin C++ 11エラー

、私はこのように私のテンプレートを宣言した:

template <typename TipoClave, typename TipoDato, 
     template <class Elem, class Alloc = allocator<Elem>> class Lista = vector> 

そして、これは動作します。私の問題は、デフォルト以外の別のコンテナを使用しようとするときに発生します。

次のように私のクラスがある:私はこのようなメインプログラムからそれを使用しようとすると、

class Tabla 
{ 
public: 
    struct Celda { 
     TipoClave clave; 
     TipoDato dato; 
    }; 

    Tabla(unsigned tam) 
    { 
     t.resize(tam); 
    } 

///< Some other functions 

private: 
    typedef Lista<Celda> ListaDatos; 
    Lista<ListaDatos> t; 
}; 

そして:

int main (void) 
{ 
    Tabla<string,Alumno,array> tabla(200); 
    ///< Some stuff 

    return 0; 
} 

しかし、この行Tabla<string,Alumno,array> tabla(200);がコンパイルされません、私を取得次のようなエラーが表示されます:

test_tabla_t.cpp: In function ‘int main()’: test_tabla_t.cpp:20:27: error: type/value mismatch at argument 3 in template parameter list for ‘template class Lista> class Tabla’ Tabla tabla(200);

私はTabla<string,Alumno,vector> tabla(200);を使用しようとしました。それは動作するので、私はこのエラーを解決する方法を知らない。

答えて

2

std::arrayを使用しようとしている場合、アロケータテンプレートパラメータは使用されません。 2番目の引数は配列のサイズです。

template< 
    class T, 
    std::size_t N 
> struct array; 

あなたがC++でどのように経験して言及していないが、あなたはより多くを学ぶためにしようとしていることから、私は10年近くC++を使用してきたと言うだろうし、一方でカウントすることができますテンプレートテンプレートパラメータを使用した回数。

この場合、Listaを「シーケンスコンテナ[1]のように動作するもの」にするには、コンセプト[2]を読んでC++ 20にすることをお勧めします。それらを使用すると、テンプレートパラメータに必要なインタフェースをコンパイラに伝えることができます。

一方、Listaをプレーンテンプレートパラメータとして宣言する方が簡単かもしれません。

[1] http://en.cppreference.com/w/cpp/concept/SequenceContainer
[2] https://en.wikipedia.org/wiki/Concepts_(C%2B%2B)

関連する問題