2009-06-05 21 views
6

que tienen los siguientes datos de los miembrosproblemas iterador C++

vector<State<T>*> activeChildren; 

Quiero limpiar en marcha estos punteros en mi 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; 
    } 
} 

me sale el siguiente error de g ++ 4.3.2 en 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 

¿Alguien me puede decir lo que he hecho mal? Me sale este error en dos lugares más donde uso bucles iterador, pero no cuando se utiliza for_each (...)

+0

Parece un buen lugar para usar boost :: ptr_vector > –

Respuesta

20

Parece que nombretipo otra vez - Creo que se necesita:

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

Una heurística para g usuarios ++ - cuando vea este mensaje en código de la plantilla:

expected `;' before ‘it’ 

es una apuesta bastante buena que la cosa frente a la 'eso' no está siendo visto por el compilador como un tipo y por lo tanto necesita un ' typename 'agregado.

+0

Nos encontramos la última vez en mi pregunta cuya respuesta fue * ding * * ding * typename! ;) – bobbyalex

+0

Bueno, traté de encontrar errores como este antes de preguntar, pero g ++ no da exactamente buenos errores. Nunca aprendí C++, solo uso lo que aprendí en el camino. – KitsuneYMG

+0

@kts: no creo que se pueda esperar que encuentres una respuesta buscando: lo más probable es que tengas que saber la respuesta para encontrar una consulta de búsqueda razonable. –

5

Es un problema de análisis sintáctico. En este código, vector<State<T>*>::iterator es un tipo dependiente anidado.

Hasta que sepa qué es T (y T no se conoce en tiempo de análisis), el analizador/analizador no se da cuenta de que el iterador es un tipo (podría ser una variable estática miembro, por lo que sabe).

Por lo tanto, debe anteponer la definición con typename como una sugerencia para decirle al compilador que para todos vector<State<T>*>, vector<State<T>*>::iterator es un nombre de tipo.