Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 预期的指针向量迭代器错误;_C++_Templates_Stl_Vector_Iterator - Fatal编程技术网

C++ 预期的指针向量迭代器错误;

C++ 预期的指针向量迭代器错误;,c++,templates,stl,vector,iterator,C++,Templates,Stl,Vector,Iterator,我使用指针向量来创建数据结构,发现出现了一个似乎不清楚的错误。下面是头文件中的基本代码 #include <vector> using namespace std; template <typename Key, typename Value> class ST{ class STNode{ public: STNode(Key k, Value v) : key(k), value(v){} ~

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

#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;  
};  
#包括
使用名称空间std;
模板
类ST{
类STNode{
公众:
STNode(键k,值v):键(k),值(v){}
~STNode(){}
钥匙;
价值观;
};  
typedef typename ST::STNode节点;
公众:
ST():v(NULL){v=新向量();}
~ST(){
//向量包含分配的对象
对于(vector::iterator it=v->begin();it!=v->end();++it)
删除(*它);
删除第五条;
}  
私人:
向量*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  
ST.h:在析构函数“ST::~ST()”中:
ST.h:20:错误:应为“;”在“它”之前
ST.h:20:在此范围内未声明错误“it”

我已经尝试删除for循环,只是尝试声明迭代器并获取范围错误。我的搜索结果表明,这通常是由于内部类末尾缺少分号或内部类中缺少公共存在,但事实并非如此。对于指针的迭代器是否有一个特殊的声明?

你正遭受C++语言有趣的怪癖。您需要在迭代器的声明中添加一个
typename
typename-vector::iterator-it
)。更多信息可以在问题中找到

您需要为
vector::iterator
添加typedef,因为它是一个依赖于模板参数的
依赖名称

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

指向容器的成员指针很少有用。考虑使成员<代码>向量v;<代码>而不是
向量*v@aschepler更重要的是:它容易出错。。。大多数人忘记了一个对象可以被复制。。。(第三条规则)这一点非常有效。我认为typedef中的typename就足够了。信息链接顺便说一句。谢谢。