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

红线标在了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;
}

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


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

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

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