无法创建从std :: vector派生的类的const对象

我正在派生stl容器类矢量并试图重载[]运算符来提供使用下标访问元素的范围检查。 但是当我尝试创建派生类Vec const对象时,我得到编译错误。

例如下面是代码:

template<class T>
class Vec : public vector<T>
{
    public:
    Vec(): vector<T>()
    {
    }
    Vec(int i):vector<T>(i)
    {
    }
    T& operator[](int i)
    {
        return at(i);
    }
    const T& operator[](int i) const
    {
       if(i>=size())
       cout<<"error"<<endl;
       return at(i);
    } 
};

void main()
{
    Vec<int> v1(10); //works fine
    const Vec<int> v(10); //error                                
}

为什么代码const矢量v(10); 工作但const Vec v1(10); 不起作用。 有什么我失踪? 为什么我无法创建const对象?


std::vector这样的STL类通常不是从派生而来的。

但代码正常工作,如下所示:

template<class T>
class Vec : public vector<T>
{
    public:
    Vec(): vector<T>()
    {
    }
    Vec(int i):vector<T>(i)
    {
    }
    T& operator[](int i)
    {
        return vector<T>::at(i);
    }
    const T& operator[](int i) const
    {
       if(i>=vector<T>::size())
       cout<<"error"<<endl;
       return vector<T>::at(i);
    } 
};

int main()
{
    Vec<int> v1(10); //works fine
    const Vec<int> v(10); //error                                
    v1.push_back(5);
    v1.push_back(6);
    int i = v1[3];
}

的功能atsize从所述基部std::vector需要与使用要么被称为vector<T>::at(i)this->at(i) 当基类是一个模板时,这总是如此:然后,“ vector<T> ”是一个依赖名称(它的含义取决于模板参数T ),在这种情况下,它的成员不会自动导出到Vec的范围类定义。

另外cout<"error"必须是cout<<"error" ,并且main必须返回一个int

在这种情况下, const不会造成问题。

通常, push_back不能用于const std::vector ,因为它修改了vector。 但是可以使用复制初始化或列表初始化来创建一个非空的const std::vector 。 例如

const std::vector<int> vec {1, 2, 3};

Bjarne Stroustrup在“C ++游览”中介绍了这个问题。

template<typename T>
class Vec : public std::vector<T> {
public:
    using vector<T>::vector;      // use the constructors from vector (under the name Vec)

    T& operator[](int i)
    { return vector<T>::at(i); }

    const T& operator[](int i) const
    { return vector<T>::at(i); }
}

“除了重新定义范围检查的下标操作外,Vec从矢量继承所有内容。”

链接地址: http://www.djcxy.com/p/73135.html

上一篇: not able to create const object of class derived from std::vector

下一篇: Draw overlay (HUD) on Android VideoView?