В C++ итератор проблемы

у меня есть следующие данные-члены

vector<State<T>*> activeChildren;

Я хочу очистить эти указатели в моем деструкторе

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

Я получаю следующую ошибку от g++ 4.3.2 на 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

может ли кто-нибудь сказать мне, что я сделал неправильно? Я получаю эту ошибку еще в двух местах, где я использую циклы итератора, но не тогда, когда я использую for_each(...)

2 ответов


снова похоже на typename - я думаю, вам нужно:

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

эвристика для пользователей g++ - Когда вы видите это сообщение в коде шаблона:

expected `;' before ‘it’

это довольно хорошая ставка, что вещь перед " it "не рассматривается компилятором как тип и поэтому нуждается в добавлении "typename".


это проблема разбора. В этом коде vector<State<T>*>::iterator вложенный зависимого типа.

пока вы не знаете, что такое T (а T не известно во время синтаксического анализа), парсер/компилятор не понимает, что итератор является типом (может быть статической переменной-членом, насколько он знает).

поэтому вы должны префикс определения с typename как подсказка, чтобы сообщить компилятору, что для всех vector<State<T>*>, vector<State<T>*>::iterator - Это имя типа.