我想为一个类重载*
运算符,如果它乘以实数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
是否可以多次重载运算符,如果是这样,为什么我会收到错误?
答案 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
声明并改为使用这些成员函数。