typename
et class
sont interchangeables dans le cas de base de la spécification d'un modèle:
template<class T>
class Foo
{
};
et
template<typename T>
class Foo
{
};
sont équivalents.
Cela dit, il existe des cas spécifiques où il y a une différence entre typename
etclass
.
Le premier concerne les types dépendants. typename
est utilisé pour déclarer lorsque vous faites référence à un type imbriqué qui dépend d'un autre paramètre de modèle, tel que typedef
dans cet exemple:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
La deuxième que vous montrez réellement dans votre question, même si vous ne vous en rendez peut-être pas compte:
template < template < typename, typename > class Container, typename Type >
Lors de la spécification d'un modèle de modèle , le class
mot clé DOIT être utilisé comme ci-dessus - il n'est pas interchangeable avec typename
dans ce cas (remarque: depuis C ++ 17, les deux mots clés sont autorisés dans ce cas) .
Vous devez également utiliser class
lors de l'instanciation explicite d'un modèle:
template class Foo<int>;
Je suis sûr qu'il y a d'autres cas que j'ai ratés, mais le résultat est: ces deux mots clés ne sont pas équivalents, et ce sont des cas courants où vous devez utiliser l'un ou l'autre.
template <typename T> typename Foo {};
, car Foo <T> est certainement une classe.