Есть шаблонный класс:| Код | template<typename Type> struct My { Type v; }; |
Все просто, класс My принимает какой то тип и описывает у себя поле данного типа.
Если мне нужно принять какой то шаблонный тип, то пишется так:| Код | template<template<typename T> class Type> struct My { Type<int> v; }; |
В данном случае я четко описываю, что класс My ожидает не просто тип, а шаблонный тип вида template<typename T> (где T ни как не участвует, он здесь просто для читаемости и его можно опустить)
Третий вариант, работа с вложенным типом:| Код | template<typename Type> struct My { typename Type::Q v; }; |
Здесь я ожидаю какой то тип, у которого есть вложенный тип Q. Чтобы компилятор понимал, что Q это именно тип, а не что-то иное нужно пояснить, написав typename.
И четвертый проблемный вариант. Я ожидаю увидеть тип с вложенным шаблонным типом Q:| Код | template<typename Type> struct My { typename Type::Q<int> v; //error template<typename> class Type::Q<int> v; //error }; |
Как описать, что вложенный тип Q не просто тип, а шаблонный тип?
Обращу внимание, что когда описывается шаблон можно использовать как template<class>, так и template<typename>, но второй вариант более правильный. но когда описывается шаблонный тип: template<template<typename> class Type> в данном месте обязательно писать class |