Search code examples
c++11templatestemplate-templates

Template template in c++11 error


I've been reading the chapter 5 of "C++ Templates, The complete guide", and i've seen the concept of "template template" templates, so tried myself.

In a template class, i've declared my template like this:

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

And this works. My problem comes when I try to use a different container than the default.

My class is as follows:

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;
};

And then, when I try to use it from the main program like this:

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

    return 0;
}

But this line Tabla<string,Alumno,array> tabla(200); does not compile, getting me an error like:

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);

I've tried to use Tabla<string,Alumno,vector> tabla(200);, and it works, so I don't know how to solve this error.


Solution

  • Assuming you're trying to use std::array, it does not take an Allocator template parameter. Its second argument is the size of the array.

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

    You haven't mentioned how experienced you are with C++, but since you're trying to learn more, I'll say that I've been using C++ for nearly a decade and can count on one hand the number of times I've used template template parameters.

    In this case, you want Lista to be "something that acts like a sequence container[1]", you might like to read about concepts[2], which may make it into C++20. They allow you to tell the compiler the interface you want a template parameter to have.

    In the meantime, it might be easier to declare Lista as a plain template parameter.

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