• 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.

    顺序 选择 循环 总结

  • 相关阅读:
    RobotFramework下的http接口自动化Get关键字的使用
    通过添加filter过滤器 彻底解决ajax 跨域问题
    TestLink和RedMine的集成
    SonarQube和Maven的集成
    RobotFramework下的http接口自动化Create Http Context关键字的使用
    正负数的源码 反码 补码 转
    SSM的,日常错误
    SSM的 日常错误 之 mybatis
    Eclipse无法启动报An internal error occurred during: "reload maven project". java.lang.NullPointerException
    错误异常
  • 原文地址:https://www.cnblogs.com/Braveliu/p/13045495.html
Copyright © 2020-2023  润新知