无法创建从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];
}
的功能at和size从所述基部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
