C++迭代器问题

Kit*_*YMG 6 c++ iterator

我有以下会员数据

vector<State<T>*> activeChildren;
Run Code Online (Sandbox Code Playgroud)

我想在析构函数中清理这些指针

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

我在Ubuntu上从g ++ 4.3.2得到以下错误:

./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
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?我在另外两个使用迭代器循环的地方得到了这个错误,但是当我使用for_each(...)时却没有

小智 20

看起来像typename时间 - 我认为你需要:

typename vector<State<T>*>::iterator it = ...
Run Code Online (Sandbox Code Playgroud)

g ++用户的启发式方法 - 当您在模板代码中看到此消息时:

expected `;' before ‘it’
Run Code Online (Sandbox Code Playgroud)

可以肯定的是,'it'前面的东西没有被编译器看作是一个类型,因此需要添加'typename'.


jma*_*g2k 5

这是一个解析问题.在此代码中,vector<State<T>*>::iterator是嵌套的依赖类型.

直到你知道T是什么(并且在解析时不知道T),解析器/编译器没有意识到迭代器是一个类型(可能是一个静态成员变量,对于它所知道的所有).

因此,必须在定义前加上typename作为提示,告诉编译器,对于所有类型vector<State<T>*>,vector<State<T>*>::iterator都是类型名称.