使用std::sort排序自定义对象向量时触发C2678编译错误求助
解决std::sort在const成员函数中的编译错误
嘿,我来帮你搞定这个困扰你的编译错误!先直接说问题的核心:你在**const成员函数getKontenListe()**里调用了std::sort对Konten向量排序,但const成员函数会把所有成员变量视为const类型,而std::sort需要修改容器的元素顺序(这属于写操作),const向量的迭代器是只读的,自然会触发错误。
错误原因拆解
getKontenListe()被标记为const,意味着这个函数不能修改Kontenmanager对象的任何成员变量,包括Konten向量。std::sort的工作原理是交换元素位置,需要非const的迭代器(也就是能修改容器元素的权限),但const向量只能提供只读迭代器,所以编译器报错“找不到接受const Konto左操作数的operator=”——本质是sort要交换元素,但const容器不允许这么做。
两种解决方案,按需选择
方案1:移除函数的const修饰(如果排序是预期的状态修改)
如果getKontenListe()的设计就是要对Konten向量进行排序并保存这个顺序,那这个函数不应该是const的。修改代码如下:
在Kontenmanager.h中修改函数声明:
string getKontenListe(); // 去掉const
在Kontenmanager.cpp中修改函数定义:
string Kontenmanager::getKontenListe() { // 去掉const stringstream out; sort(Konten.begin(), Konten.end()); // 后续操作 }
方案2:排序副本,保留原容器顺序(如果不想修改原对象状态)
如果getKontenListe()只是需要排序后的结果展示,不想改变原Konten向量的顺序,那么可以创建一个临时副本,对副本排序:
string Kontenmanager::getKontenListe() const { stringstream out; vector<Konto> tempKonten = Konten; // 复制原向量到临时变量 sort(tempKonten.begin(), tempKonten.end()); // 排序临时向量 // 接下来用tempKonten做后续的输出操作,原Konten保持不变 }
额外确认:你的operator<是正确的
顺便提一句,你重载的operator<是没问题的——参数都是const引用,而且调用的getKontonummer()也是const成员函数,这部分符合sort的要求,不用修改。
内容的提问来源于stack exchange,提问作者SSJ
相关产品推荐
相关产品推荐

