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.
順序 選擇 循環 總結