2009-06-05 11 views
6

ho i seguenti dati membriC++ problemi iteratore

vector<State<T>*> activeChildren; 

Voglio ripulire questi puntatori a mio distruttore

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

ottengo il seguente errore da g ++ 4.3.2 su 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 

Qualcuno può dirmi cosa ho fatto di sbagliato? Ottengo questo errore in più due luoghi in cui ho utilizzare i cicli iteratore, ma non quando uso for_each (...)

+0

Sembra un buon posto per usare boost :: ptr_vector > –

risposta

20

Sembra typename in volta - Penso che è necessario:

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

A euristica per utenti g ++ - quando vedi questo messaggio nel codice del modello:

expected `;' before ‘it’ 

è una buona scommessa che la cosa davanti al 'it' è non essere visto dal compilatore come un tipo e quindi ha bisogno di un ' typename 'aggiunto.

+0

Ci siamo incontrati l'ultima volta sulla mia domanda per cui la risposta era * ding * * ding * typename! ;) – bobbyalex

+0

Beh, ho provato a trovare errori come questo prima che glielo chiedessi, ma g ++ non dà esattamente errori buoni. In realtà non ho mai imparato il C++, uso solo quello che ho raccolto lungo la strada. – KitsuneYMG

+0

@kts: Non penso che ci si potrebbe aspettare che trovino una risposta cercando: è necessario conoscere la risposta per ottenere una query di ricerca ragionevole. –

5

È un problema di analisi. In questo codice, vector<State<T>*>::iterator è un tipo dipendente nidificato.

Fino a quando non si sa cosa sia T (e T non è noto in fase di analisi), il parser/compilatore non comprende che l'iteratore è un tipo (potrebbe essere una variabile membro statica, per quanto ne sa).

Pertanto, è necessario inserire come prefisso la definizione con typename come suggerimento per indicare al compilatore che per tutti vector<State<T>*>, vector<State<T>*>::iterator è un nome di tipo.