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?