C++继承指针vector的类内部排序const限定符报错求助
问题分析与解决
错误原因拆解
这个错误由两个const相关的问题导致:
SuperBin的getter函数未声明为const
你的lambda里用了const SuperBin* lhs,意味着指向的SuperBin对象是不可修改的(const)。但getSoverB()这类getter函数没有声明为const成员函数,C++不允许在const对象上调用非const成员函数——因为非const函数可能会修改对象,这会打破const的承诺,所以编译器报错。sortBySoverB()不该是const成员函数
sortBySoverB()被标记为const,但std::sort会直接修改容器内元素的顺序,这属于修改SuperBinList对象的状态,违反了const成员函数“不修改对象”的规则。
具体修改步骤
第一步:给SuperBin的所有getter函数加上const限定
在SuperBin的类声明中,所有只读取成员变量、不修改对象的getter函数,都要在函数末尾加const:
class SuperBin{ public: // ... 其他构造/析构函数不变 ... VI getIndex() const; double getNsig() const; double getNbkg() const; double getSoverB() const; double getBinZbi(const double sys) const; VS getMperpLabel() const; VS getRisrLabel() const; VS getVisLabel() const; // ... tryMerge函数不变 ... };
同时,这些函数的定义部分也要加上const,比如:
double SuperBin::getSoverB() const { return sOverB_; }
(所有getter的定义都要做同样修改)
第二步:去掉SuperBinList::sortBySoverB()的const限定
首先修改类声明中的函数签名:
class SuperBinList : public std::vector<SuperBin*> { public: // ... 其他函数不变 ... void sortByZbi(const double sys); void sortBySoverB(); // 去掉const };
然后修改函数实现,同时注意**如果要降序排序,lambda里的比较符号要改成>**(你原来用的<`是升序,不符合你说的“降序”需求):
void SuperBinList::sortBySoverB(){ std::sort(this->begin(), this->end(), [](const SuperBin* lhs, const SuperBin* rhs){ return lhs->getSoverB() > rhs->getSoverB(); // 降序用> }); }
额外说明
- const成员函数的核心规则:只要函数不修改对象的任何成员变量,就应该声明为const,这样才能在const对象或const指针上调用。
- 排序、修改容器内容这类操作,必然会改变对象状态,所以对应的成员函数不能加const。
内容的提问来源于stack exchange,提问作者anazario
相关产品推荐
相关产品推荐

