You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:54:03