std::vector的c++模板包装类

C++ Template Wrapper class for std::vector

本文关键字:包装类 vector std c++      更新时间:2023-10-16

我试图封装c++标准库的向量类使用模板,但我一直得到错误

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++新手,所以答案可能非常微不足道。

当访问依赖于模板参数的类型时,必须在前面加上typename,以使解析器清楚该类型是一个类型。

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

Vector::iterator有可能是编译时常量,但编译器在实例化之前无法知道。这就是为什么你必须明确告诉它

如果你有一个普通的

std::vector<V>::iterator

很明显,它是一个依赖名称,你需要一个typename来指示迭代器是一个类型。

使用typedef并不能真正改变这一点