typenamey classson 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 typenamey class.
El primero es en el caso de los tipos dependientes. typenamese usa para declarar cuando se hace referencia a un tipo anidado que depende de otro parámetro de plantilla, como typedefen 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 classpalabra clave debe ser utilizado como anteriormente - es no intercambiable con typenameen este caso (nota: puesto que C ++ 17 ambas palabras clave se les permite en este caso) .
También debe usar classcuando 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.