Template template argument - type / value mismatch error
Here's some sample code:
#include <stack>
#include <cstddef>
template <std::size_t N,
template <class> class Stack = std::stack
>
class Tower : protected Stack<int>
{
public:
Tower() : Stack<int>(N)
{
}
};
int main(int argc, char **argv)
{
Tower<5L> tower1();
}
And I see that the compiler (gcc) is not happy with:
file.cpp: In function 'int main(int, char**)':
file.cpp:18:11: error: type/value mismatch at argument 2 in template parameter
list for 'template<long unsigned int N, template<class> class Stack> class Tower'
file.cpp:18:11: error: expected a template of type 'template<class> class Stack',
got 'template<class _Tp, class _Sequence> class std::stack'
file.cpp:18:21: error: invalid type in declaration before ';' token
A standard container container has the following shape:
template <class Type, class Container = deque<Type> > class stack
;
Meaning I should be fine to only pass one template argument here!
Any thoughts on how to resolve this? Thanks to
source to share
'template<class> class Stack',
got 'template<class _Tp, class _Sequence> class std::stack'
shows the problem.
This is what looks like std::stack
template<
class T,
class Container = std::deque<T>
> class stack;
As you can see, there is a second parameter.
Adding:
#include <deque>
template <std::size_t N,
template <class T, class = std::deque<T>> class Stack = std::stack
>
should compile it.
source to share
std::stack
has more than one template argument. Therefore, it cannot be used in your case. You can get around this in C ++ 11 with typedefs templates.
template <typename T>
using stack_with_one_type_parameter = std::stack<T>;
template <std::size_t N,
template <class> class Stack = stack_with_one_type_parameter
>
class Tower;
source to share
Thanks for working beautifully. Here is a modification of my code that works:
#include <stack>
#include <queue>
#include <cstddef>
template <std::size_t N,
class T,
template <class, class> class Stack = std::stack,
class C = std::deque<T>
>
class Tower : protected Stack<T,C>
{
public:
Tower() : Stack<T,C>(N)
{
}
};
int main(int argc, char **argv)
{
Tower<5UL, int> tower1();
Tower<5UL, int, std::queue> tower2();
Tower<5UL, int, std::stack, std::deque<int> > tower3();
}
source to share