C++重载类operator+时报错must take either one or zero argument如何解决
报错原因
C++ 中二元operator+的重载分为两种实现形式,你当前的写法混淆了两种形式的语法规则:
- 如果你用
Hour::operator+的作用域限定写法,代表这是Hour类的成员函数。类的非静态成员函数默认隐含this指针作为第一个入参,因此二元运算符的成员函数重载仅允许传入1个参数(对应右操作数)。你当前传入了2个显式参数,加上隐含的this总共有3个入参,不符合二元运算符的参数要求,因此编译器抛出「必须接收0或1个参数」的报错。 - 额外说明:成员函数后的
const修饰符仅能用于修饰成员函数的this指针指向的对象不可变,全局函数不存在this指针,无法加该修饰。
修复方案
二选一即可:
方案1:改为全局非成员函数实现(更推荐对称运算符场景)
去掉Hour::作用域限定符和末尾的const修饰符即可:
Hour operator+(const Hour& h1, const Hour& h2){ // 可选补充:此处建议添加时分秒的进位逻辑,例如秒数超过60则向分进位 return Hour(h1.getHour()+ h2.getHour(), h1.getMinute() + h2.getMinute(), h1.getSecond() + h2.getSecond()); }
如果该函数需要访问Hour类的私有成员,需要在Hour类的定义中添加友元声明:
friend Hour operator+(const Hour& h1, const Hour& h2);
如果你已经实现了公有的getHour()/getMinute()/getSecond()方法则不需要额外声明友元。
方案2:改为类成员函数实现
保留Hour::作用域限定符,仅保留1个入参(对应右操作数),使用this指针获取当前对象(左操作数)的属性:
Hour Hour::operator+(const Hour& h2) const{ // 可选补充:此处建议添加时分秒的进位逻辑 return Hour(getHour() + h2.getHour(), getMinute() + h2.getMinute(), getSecond() + h2.getSecond()); }
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

