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

为什么类内定义的operator==无法适配unordered_set编译要求?

问题分析:结构体A的operator==为何无法被unordered_set使用?

以下代码无法编译,但取消注释全局的bool operator==函数后即可正常编译运行。为何结构体A中定义的成员operator==无法覆盖该场景?是代码错误还是合理现象?

#include <iostream>
#include <unordered_set>

using std::cout;
using std::string;


struct A
{
    string data;
    A (const char* str)
    {
        this->data = str;
    }
    bool operator== (const A& obj)
    {
        return this->data == obj.data;
    }

};

//bool operator==(const A& lhs, const A& rhs) {
//  return lhs == rhs;
//}

template<> struct std::hash<A> {
    std::size_t operator()(A const& s) const noexcept {
        std::size_t h1 = std::hash<string>{}(s.data);
        return h1;
    }
};


int main() {
    std::unordered_set<A> circles;
    A c1("a");
    A c2("b");
    circles.insert(c1);
    circles.insert(c2);

    return 0;
}

原因解析

这是合理现象,核心问题出在成员版operator==的const修饰缺失:

  • 成员函数bool operator==(const A& obj)本质上隐含了一个非const的this指针,也就是说这个函数只能被非const的A对象调用。
  • 而std::unordered_set在内部比较元素时,会把元素当作const对象处理(容器内未被修改的元素默认是const属性,内部实现也会用const引用传递参数),此时它需要调用的是支持const对象的operator==,你的成员函数不满足这个要求,编译器找不到匹配的重载,自然编译失败。

全局版能运行的原因

全局的bool operator==(const A& lhs, const A& rhs)两个参数都是const引用,不管传入的是const还是非const对象都能匹配,编译器可以找到这个重载,因此编译通过。

无需全局函数的修正方案

给成员版operator==加上const修饰,让它支持const对象调用即可:

bool operator== (const A& obj) const
{
    return this->data == obj.data;
}

内容的提问来源于stack exchange,提问作者Starodub_A_V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:15:23