Les modèles et les classes imbriquées/structures
J'ai un conteneur simple :
template <class nodeType> list {
public:
struct node {
nodeType info;
node* next;
};
//...
};
Maintenant, il y a une fonction appelée _search
qui recherche la liste et retourne une référence sur le nœud correspondant. Maintenant, quand je me réfère à la déclaration de type de la fonction, je pense qu'il devrait être list<nodeType>::node*
. Est-ce exact? Quand je définis la fonction inline, ça fonctionne parfaitement:
template <class nodeType> list {
public:
struct node {
nodeType info;
node* next;
};
node* _search {
node* temp;
//search for the node
return temp;
}
};
Mais, si j'définir la fonction à l'extérieur de la classe,
template <class nodeType> list<nodeType>::node* list<nodeType>::_search() {
//function
}
il ne fonctionne pas. Le compilateur génère un message d'erreur disant Expected constructor before list<nodeType>::_search
ou quelque chose. L'erreur est quelque chose de semblable. Je n'ai pas une machine sur laquelle je puisse le tester actuellement.
Toute aide est sincèrement apprécié.
OriginalL'auteur Rohan Prabhu | 2009-11-07
Vous devez vous connecter pour publier un commentaire.
c'est parce que
node
est un type de charge. Vous devez écrire la signature comme suit (notez que j'ai cassé en 2 lignes pour plus de clarté)Notez l'utilisation de la
typename
mot-clé.merci beaucoup pour l'aide.. il fonctionne parfaitement maintenant. merci encore..
Mise à jour du lien de la FAQ: isocpp.org/wiki/faq/templates#dependent-name-lookup-types
OriginalL'auteur rlbond
Vous devez indiquer au compilateur que
node
est un type en utilisant le mot-clétypename
.Sinon il va penser nœud comme unstatic
variable dansclass list
. Ajoutertypename
chaque fois que vous utilisez le nœud comme un type de la mise en œuvre de la liste.OriginalL'auteur Ponting