Я не уверен, что именно ваш вопрос, но вот объяснение двух приведенных вами примеров.
template <typename T, template <typename> class Cont>
class Stack;
Stack
- шаблон класса с двумя параметрами шаблона. Первый параметр T
может быть любого типа (включая встроенные типы, определяемые пользователем типы, создание шаблонов и т. Д.). Второй параметр, Cont
, должен быть шаблоном класса, принимающим один параметр. Параметр не назван, потому что он не имеет особого смысла (параметр никогда не привязан ни к чему).
template <template <typename,typename> class Cont>
class Wrapper3;
Wrapper3
- это шаблон класса с одним параметром, Cont
. Cont
должен быть шаблоном класса с двумя параметрами.
Синтаксис для определения параметра шаблона шаблона такой же, как и для определения шаблона класса (template <typename [param1], typename [param2], ...> class Name
), поэтому я не совсем понимаю, в чем ваша проблема.
Однако я согласен с тем, что синтаксис может стать немного неуклюжим, когда вы начнете «вкладывать» параметры шаблона шаблона:
// class template whose parameter must be a class template whose parameter
// must be a class template
template <template <template <typename> class > class C >
struct Wow {};
Но так часто не бывает ...