0

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

下面是我的代码:

class Vector2D {
    ...
    friend Vector2D operator* (const Vector2D&);
    friend Vector2D operator* (const double); // getting error here
};

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

是否可以多次重载运算符,如果可以,为什么会出现错误?

4

3 回答 3

8
class Vector2D {
    ...
    friend Vector2D operator* (const Vector2D&);

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

friend Vector2D operator* (const double);

你可能打算写:

friend Vector2D operator*(const Vector2D&,const Vector2D&);
friend Vector2D operator*(const Vector2D&,double);
于 2013-07-01T22:30:35.030 回答
5

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

要么删除friend(如果您想将运算符重载为成员函数),或者添加类型的第一个参数const Vector2D&Vector2D&(如果您想重载为自由函数)。后者通常更可取,因为这样您就可以对两个参数进行隐式转换——成员运算符重载将隐式转换右侧而不是左侧。

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

Vector2D operator*(Vector2D lhs, const Vector2D &rhs) {
    lhs *= rhs;
    return lhs;
}

这同样适用于加法(两个向量的加法对我来说是有意义的,而两个向量的乘法则没有)。

于 2013-07-01T22:29:22.813 回答
2

不允许覆盖内置类型的运算符。在这种情况下,您正在为不允许*的类型提供一元运算符的声明。double

我认为您想删除friend声明并改为创建这些成员函数。

于 2013-07-01T22:29:37.807 回答