typename
i class
są 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 typename
iclass
.
Pierwszy dotyczy typów zależnych. typename
służy do deklarowania, gdy odwołujesz się do typu zagnieżdżonego, który zależy od innego parametru szablonu, takiego jak typedef
w 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 class
kluczowe muszą być używane jak wyżej - to nie zamiennie ze typename
w tym przypadku (uwaga: od C ++ 17 oba słowa kluczowe są dozwolone w tym przypadku) .
Musisz także użyć class
podczas 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ą.