typename
y class
son intercambiables en el caso básico de especificar una plantilla:
template<class T>
class Foo
{
};
y
template<typename T>
class Foo
{
};
son equivalentes
Dicho esto, hay casos específicos en los que hay una diferencia entre typename
y class
.
El primero es en el caso de los tipos dependientes. typename
se usa para declarar cuando se hace referencia a un tipo anidado que depende de otro parámetro de plantilla, como typedef
en este ejemplo:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
El segundo que realmente muestra en su pregunta, aunque es posible que no se dé cuenta:
template < template < typename, typename > class Container, typename Type >
Al especificar una plantilla de la plantilla , la class
palabra clave debe ser utilizado como anteriormente - es no intercambiable con typename
en este caso (nota: puesto que C ++ 17 ambas palabras clave se les permite en este caso) .
También debe usar class
cuando crea una instancia explícitamente de una plantilla:
template class Foo<int>;
Estoy seguro de que hay otros casos que me he perdido, pero la conclusión es: estas dos palabras clave no son equivalentes, y estos son algunos casos comunes en los que necesita usar uno u otro.
template <typename T> typename Foo {};
, porque Foo <T> es definitivamente una clase.