6 Stimmen

Probleme mit C++-Iteratoren

Ich habe die folgenden Mitgliederdaten

vector<State<T>*> activeChildren;

Ich möchte diese Zeiger in meinem Destruktor bereinigen

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

Ich erhalte den folgenden Fehler von g++ 4.3.2 auf 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

Kann mir jemand sagen, was ich falsch gemacht habe? Ich erhalte diesen Fehler an zwei weiteren Stellen, an denen ich Iteratorschleifen verwende, aber nicht, wenn ich for_each(...) verwende

20voto

Sieht so aus, als wäre es wieder Zeit für typename - ich denke, Sie brauchen:

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

Eine Heuristik für g++-Benutzer - wenn Sie diese Meldung in einem Template-Code sehen:

expected `;' before ‘it’

ist es ziemlich wahrscheinlich, dass das Ding vor dem 'it' vom Compiler nicht als Typ angesehen wird und daher ein 'typename' hinzugefügt werden muss.

5voto

jmanning2k Punkte 8949

Es ist ein Parsing-Problem. In diesem Code, vector<State<T>*>::iterator ist ein verschachtelter abhängiger Typ.

Solange man nicht weiß, was T ist (und T ist zum Zeitpunkt des Parsens nicht bekannt), erkennt der Parser/Compiler nicht, dass Iterator ein Typ ist (es könnte auch eine statische Membervariable sein).

Daher müssen Sie der Definition typename als Hinweis voranstellen, um dem Compiler mitzuteilen, dass für alle vector<State<T>*> , vector<State<T>*>::iterator ist ein Typname.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X