You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:13:11