2011-11-13 61 views
1

我试图使用模板来封装C++标准库的向量类,但我不断收到错误C++模板包装类的std :: vector的

SceneVector.h: In member function ‘void scenegraph::SceneVector<V>::print()’: 
SceneVector.h:40: error: expected ‘;’ before ‘it’ 
SceneVector.h:40: error: ‘it’ was not declared in this scope 

我已经成功地创建的代码是

#include <map> 
#include <vector> 
#include <iostream> 

namespace scenegraph 
{ 
    template <class V> class SceneVector 
    { 
     typedef std::vector<V> Vector; 
     Vector vector; 

     public: 
      SceneVector(); 
      void insert(const V value); 
      void print(); 
    }; 

    template <class V> SceneVector<V>::SceneVector() 
    { 
     vector.clear(); 
    } 

    template <class V> void SceneVector<V>::insert(const V value) 
    { 
     vector.push_back(value); 
    } 

     template <class V> void SceneVector<V>::print() 
    { 
     for(Vector::iterator it = vector.begin(); it != vector.end(); ++it) 
     { 
      std::cout << "[" << (*it) << "] " << std::endl; 
     } 
     std::cout << std::endl; 
    } 
} 

任何人都可以在这里纠正我吗?我必须强化我是C++新手,所以答案可能非常微不足道。

+2

另一个......你需要'typename'。 http://stackoverflow.com/q/1123080/51831 – jpalecek

+1

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.21 – ephemient

回答

3

访问依赖于模板参数的类型时,必须预先加上typename以使分析器清楚该类型是否为类型。

for(typename Vector::iterator it = vector.begin(); it != vector.end(); ++it) 

这是可能的矢量::迭代器是一个编译时间常数,编译器无法知道,直到实例化时。这就是为什么你必须明确地告诉它。

+0

你是对的。顺便说一下,我试图在这里实现的是一个数据结构,它允许我有一个插入有序地图。我使用一个矢量来维护插入顺序和一个映射来维护键值关系。 我在正确的轨道上吗? –

+1

@JorgeSilva:你可以使用Boost.MultiIndex。 – thiton

+0

我不能。这是一个学者项目,不允许使用Boost ... –

3

如果你有一个普通的

std::vector<V>::iterator 

这将是非常明显的,它依赖的名字,那你需要一个typename,表明迭代器是一种类型。

使用typedef并没有真正改变这一点。

相关问题