Если параметр шаблона сам является шаблоном, то его собственные параметры шаблона не используются или не релевантны в контексте внешнего шаблона, кроме как для определения «сигнатуры шаблона» параметра template-template. Следовательно, вам не нужны ни имена параметров, так как они не используются или не нужны. Вы можете просто сказать это:
template <typename T, template<typename, typename> class Container = std::vector>
class stack
{
typedef Container<T, std::allocator<T> > CT;
// ...
};
Здесь template <typename, typename>
- это просто ожидаемая вами подпись шаблона класса Container
.
В C ++ 11 вы можете работать лучше и разрешать более общие контейнеры с помощью шаблонов с переменными значениями:
template <typename T, template<typename...> class Container = std::vector> class stack;
[Для полноты:] Добавление типов по умолчанию в список параметров параметра шаблона также работает, и это означает, что вы можете опустить эти типы позже (как вы уже сделали):
template<typename = T, typename = std::allocator<T> > class Container
---> now we can say:
Container<T> x; // use second default argument
Container<> y; // use both default arguments
Чтобы ответить на ваш вопрос: Вы хотите указать по умолчанию в
template <typename = T, typename = std::allocator<typename> > class Container
^^^^^^^^^^^^^^^^^^^^^^^^
Error!!
, но std::allocator<typename>
не является типом - это даже не допустимый синтаксис. Вы можете либо иметь параметр шаблона, который снова является шаблоном, то есть template <typename> = std::allocator
, но это не будет соответствовать std::vector
, либо у вас есть фактический тип:
template <typename = T, typename = std::allocator<T> > class Container
^^^^^^^^^^^^^^^^^
OK, this is a type