2012-12-15 41 views
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; 
}; 

我正在克收到錯誤消息的基本代碼++版本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循環除去並簡單地試圖聲明迭代並得到範圍錯誤。我的搜索顯示,通常這是由於內部課程結束時錯過了分號或者內部課堂缺乏公衆,但事實並非如此。是否有指針向量的迭代器需要特殊聲明?

+2

指向容器的成員指針很少有用。考慮使成員'vector v;'而不是'vector * v;'。 – aschepler

+1

@aschepler更重要的是:它很容易出錯...大多數人忘記了一個對象可以被複制......(Rule of Three) – leemes

回答

2

您正在忍受C++語言的一個有趣的怪癖。你需要添加一個typename給你迭代器的聲明(typename vector<Node*>::iterator it)。更多資料可在您需要添加的typedef vector<Node*>::iterator,因爲它是一個dependent name取決於模板模板參數的問題Why do I need to use typedef typename in g++ but not VS?

+0

這很好用。我認爲typedef中的typename就足夠了。信息鏈接btw。謝謝。 – physicsguru

1

被發現。

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

你的意思是'typename'? ;) – leemes

+1

是的,謝謝。更新 :) – billz