ERROR:C2676 二进制“==”:“Student”不定义该运算符或到预定义运算符可接收的类型的转换

ERROR:C2676 二进制“==”:“Student”不定义该运算符或到预定义运算符可接收的类型的转换

多次被同事问到此类错误,于此备录一下。

【1】复现问题

用最简单代码复现说明此问题,示例如下:

复制代码
 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 #include <vector>
 5 
 6 struct Student
 7 {
 8     std::string code;  // 学号(唯一性标识)
 9     int grade;         // 年级
10     std::map<std::string, double> scores; // <科目,成绩>
11 };
12 
13 int main()
14 {
15     std::vector<Student> vecStu;
16     vecStu.push_back({ "080605109", 6, { {"English", 100}, {"China", 100} } });
17     vecStu.push_back({ "080605113", 7, { {"English", 96}, {"China", 67} } });
18     Student obj = { "080605114", 8, { {"English", 95}, {"China", 66} } };
19     vecStu.push_back(obj);
20     // 查找元素obj
21     {
22         auto iter = std::find(vecStu.begin(), vecStu.end(), obj);
23         if (iter != vecStu.end())
24         {
25             std::cout << "method3: find exists." << std::endl;
26         }
27     }
28 
29     return 0;
30 }
复制代码

编译错误截图:

【2】原因分析

计算机弄不明白你想让它以什么标准来判断两个对象相等,所以你得给它确定了相等的标准或准则。

【3】解决方案

解决方案:自定义类,需要重载运算符“==”。

示例代码如下:

复制代码
 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 #include <vector>
 5 
 6 struct Student
 7 {
 8     std::string code;  // 学号(唯一性标识)
 9     int grade;         // 年级
10     std::map<std::string, double> scores; // <科目,成绩>
11 
12     bool operator==(const Student& obj) const
13     {
14         return obj.code == code; // 只要学号相同即可
15     }
16 };
17 
18 int main()
19 {
20     std::vector<Student> vecStu;
21     vecStu.push_back({ "080605109", 6, { {"English", 100}, {"China", 100} } });
22     vecStu.push_back({ "080605113", 7, { {"English", 96}, {"China", 67} } });
23     Student obj = { "080605114", 8, { {"English", 95}, {"China", 66} } };
24     vecStu.push_back(obj);
25     // 查找元素obj
26     {
27         auto iter = std::find(vecStu.begin(), vecStu.end(), obj);
28         if (iter != vecStu.end())
29         {
30             std::cout << "method3: find exists." << std::endl;
31         }
32     }
33 
34     return 0;
35 }
复制代码

 

good good study, day day up.

顺序 选择 循环 总结

posted @   kaizenly  阅读(9846)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
历史上的今天:
2019-06-04 Mysql 中 int(3) 和 int(11) 的区别
2018-06-04 程序随感
打赏

喜欢请打赏

扫描二维码打赏

微信打赏

点击右上角即可分享
微信分享提示