Dans certaines situations où vous référer à un membre de la dite dépendante du type (qui signifie "dépend de paramètre de modèle"), le compilateur ne peut pas toujours sans ambiguïté en déduire le sens sémantique de la résultante de construire, car il ne sait pas quel genre de nom (c'est à dire si c'est un nom, un type, un nom d'un membre de données ou le nom de quelque chose d'autre). Dans des cas comme celui que vous avez à lever l'ambiguïté de la situation, indiquez explicitement au compilateur que le nom appartient à un nom défini comme un membre de ce type de charge.
Par exemple
template <class T> struct S {
typename T::type i;
};
Dans cet exemple, le mot-clé typename
nécessaires pour le code à compiler.
La même chose se produit lorsque vous voulez faire référence à un modèle de membre de type dépendant, c'est à dire un nom qui désigne un modèle. Vous avez également à aider le compilateur en utilisant le mot - template
, même s'il est placé différemment
template <class T> struct S {
T::template ptr<int> p;
};
Dans certains cas, il peut être nécessaire d'utiliser les deux
template <class T> struct S {
typename T::template ptr<int>::type i;
};
(si j'ai la syntaxe correcte).
Bien sûr, un autre rôle: le mot-clé typename
sera utilisé dans le modèle de déclarations de paramètres.