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) ?
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) ?
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.
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.
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
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 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.