4

我正在使用一个指针向量来创建一个数据结构,并发现我收到了一个似乎不清楚的错误。这是头文件中的基本代码

#include <vector>  
using namespace std;  
template <typename Key, typename Value>  
class ST{  
    class STNode{  
    public:  
        STNode(Key k, Value v) : key(k), value(v){}  
        ~STNode(){}  
        Key key;  
        Value value;  
    };  
typedef typename ST<Key, Value>::STNode Node;  
public:  
    ST():v(NULL) {v = new vector<Node*>();}  
    ~ST(){  
        // vector contains allocated objects  
        for(vector<Node*>::iterator it = v->begin(); it != v->end(); ++it)  
        delete (*it);  
        delete v;  
    }  
private:  
    vector<Node*>* v;  
};  

我在 g++ 4.6.6 版上收到的错误消息是

ST.h: In destructor 'ST<Key, Value>::~ST()':  
ST.h:20: error: expected ';' before 'it'  
ST.h:20: error 'it' was not declared in this scope  

我尝试删除 for 循环,并尝试声明迭代器并获取范围错误。我的搜索表明,这通常归因于内部类末尾缺少分号或内部类中缺少公共存在,但事实并非如此。指针向量的迭代器是否需要特殊声明?

4

2 回答 2

2

您正在遭受 C++ 语言的一个有趣的怪癖。您需要添加一个typename迭代器 ( typename vector<Node*>::iterator it) 的声明。更多信息可以在问题中找到为什么我需要在 g++ 中使用 typedef typename 而不是 VS?

于 2012-12-15T23:41:39.753 回答
1

您需要添加 typedefvector<Node*>::iterator因为它是一个dependent name依赖于模板的模板参数。

for(typename vector<Node*>::iterator it = v->begin(); it != v->end(); ++it) 
于 2012-12-15T23:45:02.967 回答