我正在尝试使用模板封装C ++标准库的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 ++新手,所以答案可能非常微不足道。
答案 0 :(得分:3)
访问依赖于模板参数的类型时,必须添加typename
以使解析器明确该类型是一种类型。
for(typename Vector::iterator it = vector.begin(); it != vector.end(); ++it)
Vector :: iterator可能是一个编译时常量数,编译器在实例化时间之前无法知道。这就是你必须明确告诉它的原因。
答案 1 :(得分:3)
如果你有一个简单的
std::vector<V>::iterator
很明显它是依赖名称,你需要一个typename
来表明迭代器是一个类型。
使用typedef并没有真正改变它。