Шаблонное имя шаблона?
При использовании синтаксиса шаблона шаблона, как в template <template <typename> class T>, необходимо использовать ключевое слово class, так как использование typename дает ошибку в строках:
ошибка: для параметра шаблона шаблона требуется "класс" после списка параметров
В остальных случаях ключевые слова typename и class взаимозаменяемы в основном случае объявления параметра шаблона.
Можно утверждать, что требование при использовании шаблона шаблона - это намек на то, что вы ожидаете передать тип класса , но это не всегда так (особенно после того, как С++ 11 ввел шаблоны типа).
template <template <typename> class T> // 'class' keyword required.
struct Foo {
using type = T<int>;
};
template <typename T>
using type = T (*)();
using func_ptr_t = Foo<type>::type;
Каковы причины этого?
- Есть ли какая-либо конкретная причина, почему
typenameне разрешено в объявлениях шаблонов шаблонов? - Стандарт С++ говорит об этом?