2009-05-21 6 views
1

Lorsque je tente d'utiliser ma classe itérateurPourquoi ce type de retour ne fonctionne-t-il pas? (C++)

template<class T> 
class list 
{ 
public: 
class iterator; 
}; 

template<class T> 
class list<T>::iterator 
{ 
//stuff 
}; 

comme type de retour dans une surcharge d'opérateur,

template<class T> 
class list<T>::iterator 
{ 
public: 
iterator& operator++(); 
protected: 
list* lstptr; 
}; 

template<class T> 
iterator& list<T>::iterator::operator++() 
{ 
(this->lstptr)->current = ((this->lstptr)->current)->next; 
return this; 
} 

je reçois ces erreurs:

s:\jeffrey_\my_freeware_games\o\resources\container class\container(spec- o)\container_def.h(213) : error C2143: syntax error : missing ';' before '&' 
s:\jeffrey_\my_freeware_games\o\resources\container class\container(spec- o)\container_def.h(213) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
s:\jeffrey_\my_freeware_games\o\resources\container class\container(spec- o)\container_def.h(213) : error C2065: 'T' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(235) : error C2039: 'Yes' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(235) : error C2065: 'Yes' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(236) : error C2039: 'No' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(236) : error C2065: 'No' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(237) : error C2039: 'Maybe' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(237) : error C2065: 'Maybe' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(240) : error C2039: 'NoAccess' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(240) : error C2065: 'NoAccess' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(241) : error C2039: 'Read' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(241) : error C2065: 'Read' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(242) : error C2039: 'Write' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(242) : error C2065: 'Write' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(243) : error C2039: 'ReadWrite' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(243) : error C2065: 'ReadWrite' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(582) : error C2146: syntax error : missing ';' before identifier 'time_t' 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(2047) : error C2143: syntax error : missing ';' before 'identifier' 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(2047) : warning C4091: 'typedef ' : ignored on left of 'localeinfo_struct' when no variable is declared 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(2047) : fatal error C1075: end of file found before the left brace '{' at 'c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(174)' was matched 

NB: container_def.h est le fichier d'en-tête pour mes classes list et itérateur, je n'ai aucune idée de ce que sont les souceannotations ou les crtdefs.

Répondre

5

iterator n'est pas encore connu à ce stade. Vous devez lui dire qu'il est dans la classe list<T>:

template<class T> 
typename list<T>::iterator& list<T>::iterator::operator++() { 
    (this->lstptr)->current = ((this->lstptr)->current)->next; 
    return *this; // *this here, since this is a pointer only 
} 

Notez que le typename est nécessaire, car list<T>::iterator est un type préfixé avec une spécialisation de modèle, et vous devez dire au compilateur que - malgré le fait que Visual C++ acceptera probablement le code ne mettant pas typename avant lui. En omettant le typename, le compilateur devrait supposer que ce n'est pas un type et devrait produire le même message d'erreur.

Vous pourriez vous en toute sécurité ce tracas en mettant le code directement dans la classe:

template<class T> 
class list<T>::iterator 
{ 
public: 
iterator& operator++() { 
    (this->lstptr)->current = ((this->lstptr)->current)->next; 
    return *this; // *this here, since this is a pointer only 
} 
protected: 
    list* lstptr; 
}; 
+0

Oui, le nom de fichier est certainement ce que je cherchais, (je ne savais pas qu'il existait) J'ai essayé d'utiliser la liste :: itérateur &, mais le compilateur m'a dit qu'il ne le reconnaissait pas comme type. –

+0

Oh bien. On dirait que le compilateur l'exige effectivement à certains endroits. Dans certains articles, j'ai vu des personnes utilisant msvC++ ne sont pas tenus de le mettre à certains endroits où il est normalement nécessaire :) –

1

litb a answered votre question complètement. Je pense qu'il vaut la peine de souligner que dans un effort pour rendre le C++ plus facile à utiliser, le Comité C++ a ajouté une nouvelle syntaxe pour la déclaration des fonctions. Le résultat est que vous serez en mesure de définir votre fonction comme suit (n2541) sans avoir besoin de la qualification supplémentaire:

template<class T> 
auto list<T>::iterator::operator++()->iterator& 
{ 
    // ... 
} 

Selon la fonctionnalité prise en charge list, GCC 4.4 a déjà cette fonctionnalité.

Questions connexes