无法创建从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