766 votes

Différence de C++ de mots-clés ' typename ' et ' classe ' dans les modèles

Pour les modèles que j’ai vu les deux déclarations :

Et :

Quelle est la différence ?

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

603voto

Aaron Klotz Points 4346

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 équivalentes.

Cela dit, il y a des cas spécifiques où il y a une différence entre typename et class.

Le premier est dans le cas de types de charge. typename est utilisé pour déclarer lorsque vous faites référence à un type imbriqué qui dépend d'un autre paramètre du modèle, tels que l' typedef dans cet exemple:

template<typename param_t>
class Foo
{
    typedef typename param_t::baz sub_t;
};

Le second, vous montrez à votre question, si vous ne pourriez pas le réaliser:

template < template < typename, typename > class Container, typename Type >

Lors de la spécification d'un modèle de modèle, l' class mot-clé DOIT être utilisée comme ci-dessus, il est pas interchangeable avec typename dans ce cas.

Vous devez également utiliser class quand explicitement l'instanciation d'un modèle:

template class Foo<int>;

Je suis sûr qu'il y a d'autres cas que j'ai raté, mais la ligne de fond est: ces deux mots ne sont pas équivalents, et voici quelques-uns des cas où vous devez utiliser l'un ou l'autre.

131voto

Georg Fritzsche Points 59185

Le nommage des paramètres du modèle, typename et class sont équivalentes. §14.1.2:

Il n'y a pas de différence sémantique entre la classe et le nom dans un template-parameter.

typename est cependant possible, dans un autre contexte lors de l'utilisation de modèles de faire allusion au compilateur que vous faites référence à un type de charge. §14.6.2:

Un nom utilisé dans un modèle de déclaration ou à une définition qui dépend de un modèle à paramètre est supposé ne pas nom d'un type, à moins que le nom applicables recherche trouve un nom de type ou le nom est qualifié par le mot-clé typename.

Exemple:

typename some_template<T>::some_type

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

37voto

Michael Anderson Points 21181

Bien qu’il n’y a aucune différence technique, j’ai vu les deux utilisés pour désigner des choses un peu différentes.

Pour un modèle qui devrait accepter n’importe quel type comme T, y compris built-ins (par exemple un tableau)

Pour un modèle qui fonctionnera uniquement où T est une vraie classe.

Mais n’oubliez pas que c’est purement une chose de style, que certaines personnes utilisent. Non prescrits par la norme ou forcée par les compilateurs

12voto

Nikolai N Fetissov Points 52093
<ol> <li>Aucune différence</li><li>Paramètre de type de modèle <code></code> est en soi un modèle avec deux types de paramètres.</li></ol>

7voto

K.K Points 72

Ce morceau de morceau de code est du c++ primer livre. Même si je suis sûr que c'est mal.

Chaque type de paramètre doit être précédée par le mot-clé class ou typename:

// error: must precede U with either typename or class
template <typename T, U> T calc(const T&, const U&);

Ces mots-clés ont le même sens et peuvent être utilisés de façon interchangeable à l'intérieur d'un modèle de liste de paramètres. Un modèle de liste de paramètres peut utiliser les deux mots-clés:

// ok: no distinction between typename and class in a template parameter list
template <typename T, class U> calc (const T&, const U&);

Il peut sembler plus intuitif à utiliser le mot-clé typename plutôt que de classe pour désigner un modèle type de paramètre. Après tout, nous pouvons utiliser intégré (nonclass) types de comme un modèle de type d'argument. En outre, typename plus indique clairement que le nom qui suit est un nom de type. Toutefois, le nom a été ajouté à C++ après les modèles étaient déjà largement répandues; certains programmeurs de continuer à utiliser la classe exclusivement

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X