[C++] Différence de mots-clés 'typename' et 'class' dans les templates?


Answers

Pour nommer les paramètres du template, typename et class sont équivalents. §14.1.2:

Il n'y a pas de différence sémantique entre class et typename dans un template-parameter.

typename est toutefois possible dans un autre contexte lors de l'utilisation de templates - pour indiquer au compilateur que vous faites référence à un type dépendant. §14.6.2:

Un nom utilisé dans une déclaration ou une définition de modèle et dépendant d'un paramètre de modèle est supposé ne pas nommer un type à moins que la recherche de nom applicable ne trouve un nom de type ou que le nom soit qualifié par le mot-clé typename.

Exemple:

typename some_template<T>::some_type

Sans nom de typename le compilateur ne peut pas dire en général si vous faites référence à un type ou non.

Question

Pour les modèles, j'ai vu les deux déclarations:

template < typename T >
template < class T >

Quelle est la différence?

Et que signifient exactement ces mots clés dans l'exemple suivant (tiré de l'article de Wikipédia allemand sur les modèles)?

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};



  1. Aucune différence
  2. Paramètre de type de modèle Container est lui-même un modèle avec deux paramètres de type.