typename
e class
são intercambiáveis no caso básico de especificar um modelo:
template<class T>
class Foo
{
};
e
template<typename T>
class Foo
{
};
são equivalentes.
Dito isto, há casos específicos em que há uma diferença entre typename
e class
.
O primeiro é no caso de tipos dependentes. typename
é usado para declarar quando você está referenciando um tipo aninhado que depende de outro parâmetro de modelo, como typedef
neste exemplo:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
O segundo que você realmente mostra na sua pergunta, embora você possa não perceber:
template < template < typename, typename > class Container, typename Type >
Ao especificar um modelo modelo , a class
palavra-chave deve ser usada como acima - é não intercambiáveis com typename
neste caso (nota: uma vez C ++ 17 palavras-chave são permitidos neste caso) .
Você também deve usar class
ao instanciar explicitamente um modelo:
template class Foo<int>;
Tenho certeza de que há outros casos que perdi, mas o ponto principal é: essas duas palavras-chave não são equivalentes e são alguns casos comuns em que você precisa usar uma ou outra.
template <typename T> typename Foo {};
, porque Foo <T> é definitivamente uma classe.