【问题标题】:Iterator for vector of pointers error expected ;预期指针错误向量的迭代器;
【发布时间】:2012-12-03 13:08:48
【问题描述】:

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

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

【问题讨论】:

  • 指向容器的成员指针很少有用。考虑将成员设为 vector&lt;Node*&gt; v; 而不是 vector&lt;Node*&gt;* v;
  • @aschepler 更重要的是:它容易出错......大多数人忘记了可以复制对象......(三法则)

标签: c++ templates stl vector iterator


【解决方案1】:

您正在遭受 C++ 语言的一个有趣的怪癖。您需要在迭代器的声明中添加typename (typename vector&lt;Node*&gt;::iterator it)。更多信息可以在问题Why do I need to use typedef typename in g++ but not VS?

中找到

【讨论】:

  • 这非常有效。我认为 typedef 中的 typename 就足够了。信息链接顺便说一句。谢谢。
【解决方案2】:

您需要为 vector&lt;Node*&gt;::iterator 添加 typedef,因为它是一个 dependent name,它取决于模板和模板参数。

for(typename vector<Node*>::iterator it = v->begin(); it != v->end(); ++it) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2014-10-31
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多