纤维Fibre 2022-12-29 18:26 采纳率: 64.3%
浏览 21
已结题

这种方式的运算符重载为什么不允许?

红线标在了29行return t1 * t2;的*这里
错误信息: C2678 二进制“*”: 没有找到接受“const Time”类型的左操作数的运算符(或没有可接受的转换)
倒数第二行return t1 * t2; 我的想法是调用 t1.operator*(t2)
我是看教科书上的实例,但是我写出来就不对,但是将27行参数列表中const删去便可以成功,这是为什么?
class Time
{
private:
    int hour;
    int min;
    int sec;
public:
    Time();
    Time(int h, int m, int s)    
{
    hour = h;
    min = m;
    sec = s;
}

    Time operator*(double t)
{
    Time sum;
    int tolsec = sec + t.sec;
    int tolmin = tolsec / 60 + min + t.min;
    sum.hour = tolmin / 60 + hour + t.hour;
    sum.min = tolmin % 60;
    sum.sec = tolsec % 60;
    return sum;
}
}
Time operator*(double t2,const Time& t1)
{
    return t1 * t2;
}

  • 写回答

1条回答 默认 最新

  • ShowMeAI 2022-12-29 18:39
    关注

    代码中的问题是,在定义友元函数operator*时,参数t1的类型是const Time &,但是在调用t1 * t2时,t1是一个对象而不是一个引用,所以编译器无法找到可以接受对象的左操作数的运算符。


    解决方法是将t1的类型改为对象,即

    Time operator*(double t2, Time t1)
    {
        return t1 * t2;
    }
    

    如果原来的t1是一个常量对象,那么就不能通过友元函数修改它的值了。如果希望保留对常量对象的修改能力,可以将t1的类型改为常量引用。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月31日
  • 修改了问题 12月29日
  • 创建了问题 12月29日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误