类模板动态数组报错:传递const Vector作为this参数丢弃限定符
解决const Vector调用非const成员函数的报错问题
嘿,我来帮你理清这个问题!这个报错的核心原因其实很简单:
你在Registration::writeFile函数后面加了const修饰符,这意味着在这个函数内部,所有的类成员变量都会被视为const类型——包括你的results(也就是const Vector<Result>)。
但你的Vector类里只定义了非const版本的operator[]:
T& operator[](int index);
这个函数返回的是可修改的引用,编译器会认为它可能会修改Vector对象的状态。而const对象是不允许调用可能修改自身的非const成员函数的,这就是报错提示"discards qualifiers"的原因——你试图把const对象当成非const来用,违反了const的约束。
解决方案:添加const版本的operator[]
你只需要给Vector类补充一个const限定的operator[]重载,专门给const对象使用:
首先在Vector类的public声明里添加:
const T& operator[](int index) const;
然后实现这个函数:
template <class T> const T& Vector<T>::operator[](int index) const { if(index < 0 || index >= this->nrofel){ throw("Out of bounds."); } return *this->data[index]; }
这样做的好处是:
- 普通的非const
Vector对象会调用原来的T& operator[],允许你修改元素 - const
Vector对象(比如writeFile里的results)会调用这个const版本,返回只读的引用,完全符合const函数的要求
额外小提示
你还可以把Vector类里的size()成员函数也改成const的,因为它只是返回成员变量,不会修改对象:
int size() const {return this->nrofel;}
这样在const函数里调用results.size()也不会有问题。
内容的提问来源于stack exchange,提问作者thedafferg
相关产品推荐
相关产品推荐

