В 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
- Это имя типа.