Visual Studio中operator==运算符出现C2804等报错求助
C++ operator==运算符报错解决
问题背景
作为编程初学者,学习operator==运算符时在Visual Studio中遇到报错:
C2804 binary 'operator ==' has too many parameters
代码文件
Duree.cpp
#include "Duree.h" #include<iostream> Duree::Duree(int h,int m,int s) : m_h(h),m_m(m),m_s(s) { } bool Duree::estEgal(Duree const& b) const { return (m_h == b.m_h && m_m == b.m_m && m_s == b.m_s); } bool operator==(Duree const& a, Duree const& b) { return a.estEgal(b); }
Duree.h
#ifndef DUREE_H_INCLUDED #define DUREE_H_INCLUDED class Duree { public: Duree(int h = 0,int m = 0,int s = 0); bool estEgal(Duree const& b) const; bool operator==(Duree const& a, Duree const& b); private: int m_h; int m_m; int m_s; }; #endif
main.cpp
#include <iostream> #include "Duree.h" using namespace std; int main() { Duree a(10,10,10),b(20,20,20); cout << "Hello world! " << endl; if (a == b) { cout << "a = b"; } return 0; }
完整报错信息
Error C2804 binary 'operator ==' has too many parameters Error C2676 binary '==': 'Duree' does not define this operator or a conversion to a type acceptable to the predefined operator cplusplus Error C2804 binary 'operator ==' has too many parameters cplusplus Error (active) E0349 no operator "==" matches these operands cplusplus Severity Code Description Project File Line Suppression State Error C2804 binary 'operator ==' has too many parameters cplusplus C:\Users\ACER\source\repos\cplusplus\cplusplus\Duree.h 12 Error C2676 binary '==': 'Duree' does not define this operator or a conversion to a type acceptable to the predefined operator cplusplus C:\Users\ACER\source\repos\cplusplus\cplusplus\cplusplus.cpp 11 Error C2804 binary 'operator ==' has too many parameters cplusplus C:\Users\ACER\source\repos\cplusplus\cplusplus\Duree.h 12 Error (active) E0349 no operator "==" matches these operands cplusplus C:\Users\ACER\source\repos\cplusplus\cplusplus\cplusplus.cpp 11
问题原因
报错核心是错误地将operator==声明为类的成员函数且参数数量违规。类的成员函数会隐含一个this指针(指向当前对象),因此你声明的bool operator==(Duree const& a, Duree const& b)实际会有3个参数(this + a + b),超出二元运算符允许的参数数量,触发C2804错误。同时编译器无法识别合法的==运算符,导致后续C2676和E0349错误。
解决方法
提供两种可行修复方案:
方案一:将operator==改为全局函数(推荐)
修改Duree.h,移除类内错误的operator==声明,改为全局函数的友元声明(确保能访问类的私有成员):
#ifndef DUREE_H_INCLUDED #define DUREE_H_INCLUDED class Duree { public: Duree(int h = 0,int m = 0,int s = 0); bool estEgal(Duree const& b) const; // 声明友元全局运算符函数 friend bool operator==(Duree const& a, Duree const& b); private: int m_h; int m_m; int m_s; }; // 全局函数声明 bool operator==(Duree const& a, Duree const& b); #endif
Duree.cpp中的全局operator==实现保持不变。
方案二:将operator==改为类的成员函数
作为成员函数,仅需一个参数(当前对象通过this指针隐含传递):
- 修改
Duree.h中的声明:
bool operator==(Duree const& b) const;
- 在
Duree.cpp中实现成员函数:
bool Duree::operator==(Duree const& b) const { return estEgal(b); }
- 删除
Duree.cpp中原有的全局operator==函数。
两种方案都能让main.cpp中的a == b正常编译运行。
内容的提问来源于stack exchange,提问作者عبدالرحمان سوديني
相关产品推荐
相关产品推荐

