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
是否有可能不止一次地重载运算符,如果是这样,为什么我会收到错误?
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)
问题是你是一元的operator*,而不是二元的.您的friend声明不是成员函数.
删除friend(如果要将运算符作为成员函数重载),或者添加第一个类型参数const Vector2D&或Vector2D&(如果要作为自由函数重载).后者通常是可取的,因为那时你得到两个参数的隐式转换 - 成员运算符重载将隐式转换右侧而不是左侧.
您可能不希望将引用作为二进制文件的第一个参数的原因operator*是您可以像这样实现它:
Vector2D operator*(Vector2D lhs, const Vector2D &rhs) {
lhs *= rhs;
return lhs;
}
Run Code Online (Sandbox Code Playgroud)
这同样适用于加法(并且两个向量的加法对于我来说是有意义的,即两个向量的乘法没有).
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |