Dans certaines situations où vous faites référence à un membre de type dépendant (signifiant "dépendant du paramètre de modèle"), le Le compilateur ne peut pas toujours déduire sans ambiguïté la signification sémantique de la construction résultante, car il ne sait pas quel type de nom (c'est-à-dire s'il s'agit d'un nom, d'un membre ou d'un autre). Dans de tels cas, vous devez désambiguïser la situation en disant explicitement au compilateur que le nom appartient à un nom de type défini en tant que membre de ce type dépendant.
Par exemple
template <class T> struct S {
typename T::type i;
};
Dans cet exemple, le mot-clé dans typename
nécessaire pour le code à compiler. La même chose se produit lorsque vous souhaitez faire référence à un membre de modèle de type dépendant, c'est-à-dire à un nom qui désigne un modèle. Vous devez également aider le compilateur en utilisant le mot-clé template
, bien qu'il soit 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 je suis la syntaxe correcte) .
Bien sûr, un autre rôle du mot clé typename
doit être utilisé dans les déclarations de paramètres de modèle.
http://stackoverflow.com/questions/1600464/ – sbi