使用不同的参数重载运算符两次

hak*_*ata 0 c++ operator-overloading

我想*为一个类重载运算符,一个是在它乘以一个实数double而另一个是乘以相同的类类型的情况.

以下是我的代码:

class Vector2D {
    ...
    friend Vector2D operator* (const Vector2D&);
    friend Vector2D operator* (const double); // getting error here
};
Run Code Online (Sandbox Code Playgroud)

我得到的错误是: 'Vector2D operator*(double)' must have an argument of class or enumerated type

是否有可能不止一次地重载运算符,如果是这样,为什么我会收到错误?

Dav*_*eas 8

class Vector2D {
    ...
    friend Vector2D operator* (const Vector2D&);
Run Code Online (Sandbox Code Playgroud)

这就是将一元operator*(即解除引用运算符)重载为自由函数,而不是重载两个向量的乘法.您不能重载仅适用于非类类型的运算符,这是错误:

friend Vector2D operator* (const double);
Run Code Online (Sandbox Code Playgroud)

你可能想写:

friend Vector2D operator*(const Vector2D&,const Vector2D&);
friend Vector2D operator*(const Vector2D&,double);
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 5

问题是你是一元的operator*,而不是二元的.您的friend声明不是成员函数.

删除friend(如果要将运算符作为成员函数重载),或者添加第一个类型参数const Vector2D&Vector2D&(如果要作为自由函数重载).后者通常是可取的,因为那时你得到两个参数的隐式转换 - 成员运算符重载将隐式转换右侧而不是左侧.

您可能不希望将引用作为二进制文件的第一个参数的原因operator*是您可以像这样实现它:

Vector2D operator*(Vector2D lhs, const Vector2D &rhs) {
    lhs *= rhs;
    return lhs;
}
Run Code Online (Sandbox Code Playgroud)

这同样适用于加法(并且两个向量的加法对于我来说是有意义的,即两个向量的乘法没有).