2009-06-05 11 views
6

j'ai les données membres suivantsC++ problèmes iterator

vector<State<T>*> activeChildren; 

Je veux nettoyer jusqu'à ces pointeurs dans mon destructor

StateContainer<T>::~StateContainer() { 
    vector<State<T>*>::iterator it = 
     activeChildren.begin(); 
    while(it!=activeChildren.end()) { 
     State<T>* ptr = *it; 
     it = activeChildren.erase(it); 
     delete ptr; 
    } 
} 

Je reçois l'erreur suivante de g ++ 4.3.2 sur Ubuntu:

./fsm2/StateContainer.cpp: In destructor ‘virtual ervan::StateContainer<T>::~StateContainer()’: 
../fsm2/StateContainer.cpp:24: error: expected `;' before ‘it’ 
../fsm2/StateContainer.cpp:25: error: ‘it’ was not declared in this scope 

Quelqu'un peut-il me dire ce que j'ai mal fait? Je reçois cette erreur dans deux endroits où j'utilise des boucles de iterator, mais pas quand je l'utilise for_each (...)

+0

On dirait un bon endroit à utiliser boost :: ptr_vector > –

Répondre

20

Ressemble typename temps encore - je pense que vous avez besoin:

typename vector<State<T>*>::iterator it = ... 

Une heuristique pour g ++ utilisateurs - quand vous voyez ce message dans le code du modèle:

expected `;' before ‘it’ 

est un pari assez bon que la chose devant la «ce n'est pas vu par le compilateur comme un type et a besoin donc un ' nom de fichier ajouté.

+0

Nous nous sommes rencontrés la dernière fois sur ma question pour laquelle la réponse était * ding * * ding * typename! ;) – bobbyalex

+0

Eh bien j'ai essayé de trouver des erreurs comme celle-ci avant que je demande, mais g ++ ne donne pas exactement de bonnes erreurs. Je n'ai jamais vraiment appris le C++, j'utilise juste ce que j'ai ramassé en cours de route. – KitsuneYMG

+0

@kts: Je ne pense pas qu'on puisse s'attendre à ce que vous trouviez une réponse en effectuant une recherche - vous devriez à peu près connaître la réponse pour obtenir une requête de recherche raisonnable. –

5

C'est un problème d'analyse. Dans ce code, vector<State<T>*>::iterator est un type dépendant imbriqué. Jusqu'à ce que vous sachiez ce que T est (et T n'est pas connu au moment de l'analyse), l'analyseur/compilateur ne réalise pas que l'itérateur est un type (pourrait être une variable membre statique, pour autant qu'il le sache).

Par conséquent, vous devez préfixer la définition avec le nom de type comme un indice pour indiquer au compilateur que pour tous vector<State<T>*>, vector<State<T>*>::iterator est un nom de type.