const成员函数调用vector::push_back报无匹配函数的原因排查
嘿,我来帮你揪出这个问题的根源——你大概率被编译器的错误提示误导了!你以为是类型不匹配,但真正的问题出在const成员函数的权限限制上。
核心原因拆解
你在const成员函数MapWindow::shuffleTiles()里尝试调用tileSet_.push_back(s),但const成员函数有一个关键特性:它会把函数内所有非mutable的成员变量视为const类型。也就是说,在这个函数里,tileSet_的实际类型是const std::vector<std::string>,而push_back是一个会修改容器内容的非const成员函数——const容器根本没有这个成员方法,所以编译器才会报“no matching member function call to 'push_back'”。
至于你担心的类型匹配问题:从std::pair<std::string, unsigned>里取出的std::string是完全没问题的,这部分逻辑没有错误,只是编译器的报错信息没直接点出const的问题,才让你走了弯路。
两种修复方案
根据你的实际需求,你可以选下面其中一种方案:
去掉函数的const修饰符
如果shuffleTiles()的职责就是修改tileSet_,那它本来就不应该是const函数。去掉const后,函数内就能正常修改成员变量了:class MapWindow { private: std::vector<std::string> tileSet_; public: // 去掉const修饰符 void shuffleTiles() { // 从tileAmounts中选取std::string s的逻辑 tileSet_.push_back(s); // 现在可以正常编译 } };给tileSet_添加mutable关键字
如果必须保持shuffleTiles()为const函数(比如它的逻辑不影响对象的“外部可见状态”,只是修改内部缓存或临时数据),可以把tileSet_声明为mutable,这样就能在const函数里修改它:class MapWindow { private: // 添加mutable修饰 mutable std::vector<std::string> tileSet_; public: void shuffleTiles() const { // 从tileAmounts中选取std::string s的逻辑 tileSet_.push_back(s); // 现在可以正常编译 } };注意:
mutable要谨慎使用,只有当变量的修改不破坏对象的“逻辑常量性”时才适合用。
内容的提问来源于stack exchange,提问作者sesodesa

