2012-12-15 2 views
4

포인터의 벡터를 사용하여 데이터 구조를 만들었으며 명확하지 않은 오류가 나타납니다. 내가 for 루프를 제거하는 시도하고 단순히 반복자를 선언하려고했습니다포인터 벡터에 대한 반복자가 예상됩니다.

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 

여기에 헤더 파일

#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입니다 범위 오류를 가져옵니다. 내 검색 결과에 따르면 일반적으로 내부 클래스 끝에 세미콜론이 누락되거나 내부 클래스에 public이 없기 때문에 발생합니다. 그러나이 경우는 아닙니다. 포인터 벡터의 반복자에 특별한 선언이 필요합니까?

+2

컨테이너에 대한 구성원 포인터는 거의 유용하지 않습니다. ' * v;'대신' v; '멤버를 만드십시오. – aschepler

+1

@aschepler 더 중요 : 오류가 발생하기 쉽습니다 ... 대부분의 사람들은 객체를 복사 할 수 있다는 것을 잊어 버립니다 ... (규칙 3) – leemes

답변

2

흥미로운 C++ 언어의 괴로움을 겪고 있습니다. 이터레이터 선언에 typename을 추가해야합니다 (typename vector<Node*>::iterator it). 더 많은 정보는 질문에서 찾을 수 있습니다 Why do I need to use typedef typename in g++ but not VS?

+0

이것은 완벽하게 작동했습니다. typedef의 typename으로 충분하다고 가정했습니다. 유익한 링크 btw. 감사. – physicsguru

1

vector<Node*>::iterator에 대한 typedef는 템플릿 매개 변수에 따라 dependent name이므로 추가해야합니다.

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

'typename'을 의미합니까? ;) – leemes

+1

예, 감사합니다. updated :) – billz

관련 문제