C++ template typename itérateur
Envisager le fichier en-tête suivante:
template <typename T> struct tNode
{
T Data; //the data contained within this node
list<tNode<T>*> SubNodes; //a list of tNodes pointers under this tNode
tNode(const T& theData)
//PRE: theData is initialized
//POST: this->data == theData and this->SubNodes have an initial capacity
// equal to INIT_CAPACITY, it is set to the head of SubNodes
{
this->Data = theData;
SubNodes(INIT_CAPACITY); //INIT_CAPACITY is 10
}
};
Maintenant, considérons une ligne de code à partir d'un autre fichier:
list<tNode<T>*>::iterator it(); //iterate through the SubNodes
Le compilateur me donne ce message d'erreur: Tree.h:38:17: error: need ‘typename’ before ‘std::list<tNode<T>*>::iterator’ because ‘std::list<tNode<T>*>’ is a dependent scope
Je n'ai aucune idée pourquoi le compilateur est de me crier dessus pour cela.
Vous devez vous connecter pour publier un commentaire.
Dans
list<tNode<T>*>::iterator
, vous avez un personne à charge nom, c'est un nom qui dépend d'un paramètre du modèle.En tant que tel, le compilateur ne peut pas inspecter le
list<tNode<T>*>
(il n'a pas sa définition à ce stade) et donc elle ne sait pas silist<tNode<T>*>::iterator
est un champ statique ou d'un type.Dans une telle situation, le compilateur suppose que c'est un champ, donc dans votre cas, il génère une erreur de syntaxe. Pour résoudre le problème, il suffit de dire au compilateur que c'est un type en mettant un
typename
à l'avance de la déclaration:Tout d'abord, comme d'autres réponses déjà noté, les noms de type imbriqué dans des types dépendants doivent être précédées de la
typename
mot-clé.Ce mot-clé n'est pas nécessaire lorsque le modèle est entièrement spécialisée, ce qui signifie que
list<tnode<int>*>::iterator
n'a pas besoin detypename
, mais quand l'extérieur de la classe dépend toujours de paramètre de modèleT
,typename
doit être présent.D'autre part, même avec
typename
ladéclaration de déclarer une fonction, pas un itérateur. Supprimer la
()
.list<tNode<T>*>::iterator
est une personne à charge nom, un type qui dépend d'un paramètre du modèle. Pour déclarer une variable, vous devez utiliser letypename
mot-clé:Plus de fond sur les réponses ci-dessus est fournie ici
Une Description de la C++ mot-clé typename
J'ai eu un autre problème similaire que j'ai voulu typedef un itérateur pour les nœuds enfants avec l' :
qui m'a donné la même erreur du compilateur. Avec les suggestions ici et l'aide du lien ci-dessus, la solution à mon problème est d'utiliser
à la place.