C++中const vector传入函数调用find()编译报错的问题及解决
问题分析与解决
问题重现
给定如下Point类和判断对象是否存在的函数:
class Point { int x, y; public: Point(int x0, int y0): x(x0), y(y0) {}; bool operator==(const Point& rval) { return x == rval.x && y == rval.y; } };
bool hasVal(std::vector<Point>& vec, const Point& target) { return find(vec.begin(), vec.end(), target) != vec.end(); }
当将vec参数改为const std::vector<Point>&时,出现编译错误:
241 17 C:\Program Files (x86)\Embarcadero\Dev-Cpp\TDM-GCC-64\lib\gcc\x86_64-w64-mingw32\9.2.0\include\c++\bits\predefined_ops.h [Error] no match for 'operator==' (operand types are 'const Point' and 'const Point')
同时,若将该vector作为类成员在const成员函数中操作,也会触发类似错误。
原因分析
问题核心在于operator==成员函数的声明:
- 当vector是const引用时,其迭代器返回的是const Point对象,而const对象只能调用被
const修饰的成员函数(编译器会认为非const成员函数可能修改对象状态)。 - 当前的
operator==未声明为const成员函数,编译器判定它无法被左侧的const Point对象调用,因此找不到匹配的运算符重载。 - 内置类型(如int)的
==运算符不存在成员函数的const限制,所以vector<int>的const引用版本可以正常工作。
最优解决方法
将operator==成员函数声明为const,明确该函数不会修改任何成员变量,允许被const对象调用:
class Point { int x, y; public: Point(int x0, int y0): x(x0), y(y0) {}; // 添加const修饰符,放在函数参数列表之后 bool operator==(const Point& rval) const { return x == rval.x && y == rval.y; } };
修改后,hasVal函数可以安全地将参数改为const引用:
bool hasVal(const std::vector<Point>& vec, const Point& target) { return find(vec.begin(), vec.end(), target) != vec.end(); }
同时,const成员函数中操作该vector成员的场景也能正常编译。
内容的提问来源于stack exchange,提问作者Daniel R. Collins
相关产品推荐
相关产品推荐

