typenamei classsą wymienne w podstawowym przypadku określania szablonu:
template<class T>
class Foo
{
};
i
template<typename T>
class Foo
{
};
są równoważne.
To powiedziawszy, istnieją szczególne przypadki, w których istnieje różnica między typenameiclass .
Pierwszy dotyczy typów zależnych. typenamesłuży do deklarowania, gdy odwołujesz się do typu zagnieżdżonego, który zależy od innego parametru szablonu, takiego jak typedefw tym przykładzie:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Drugi, który faktycznie pokazujesz w swoim pytaniu, choć możesz nie zdawać sobie z tego sprawy:
template < template < typename, typename > class Container, typename Type >
Określając szablon szablon The classkluczowe muszą być używane jak wyżej - to nie zamiennie ze typenamew tym przypadku (uwaga: od C ++ 17 oba słowa kluczowe są dozwolone w tym przypadku) .
Musisz także użyć classpodczas jawnego tworzenia szablonu:
template class Foo<int>;
Jestem pewien, że są inne przypadki, które przegapiłem, ale sedno jest następujące: te dwa słowa kluczowe nie są równoważne i są to niektóre typowe przypadki, w których musisz użyć jednego lub drugiego.
template <typename T> typename Foo {};, ponieważ Foo <T> jest zdecydowanie klasą.