Por que um parâmetro de modelo não permite 'typename' após a lista de parâmetros

Typename do modelo de modelo?

Ao usarmodelo modelo sintaxe como emtemplate <template <typename> class T>, é necessário usar a palavra-chaveclass, como usandotypename dá um erro ao longo das linhas de:

erro: o parâmetro do modelo requer 'classe' após a lista de parâmetros

Em qualquer outro lugar, as palavras-chavetypename eclass estão intercambiável no caso básico de declarar um parâmetro de modelo.

Você pode argumentar que o requisito ao usar o modelo de modelo é uma dica de que você deve passar umtipo de classe, mas esse nem sempre é o caso (principalmente depois que o C ++ 11 introduziu aliases de tipo modelo).

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;
Qual é o raciocínio por trás disso?Existe alguma razão específica para o porquêtypename énão permitido nas declarações de modelo?OPadrão C ++ diz alguma coisa sobre isso?

questionAnswers(2)

yourAnswerToTheQuestion