Шаблонное имя шаблона?
При использовании синтаксиса шаблона шаблона, как в 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
не разрешено в объявлениях шаблонов шаблонов? - Стандарт С++ говорит об этом?