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

时间:2013-07-01 22:25:28

标签: c++ operator-overloading

我想为一个类重载*运算符,如果它乘以实数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

是否可以多次重载运算符,如果是这样,为什么我会收到错误?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:5)

问题是你正在超载一元operator*,而不是二进制。您的friend声明不是成员函数。

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

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

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

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

答案 2 :(得分:2)

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

我认为您要删除friend声明并改为使用这些成员函数。