我是重载运算符的新手,我做了一些搜索并找到了这篇有用的文章,我像作者那样编写了自己的代码,但是我得到了
vector vector::operator*(float, vector) must take either zero or one argument
错误。
这是我的代码:
class vector
{
public:
float x;
float y;
vector(float, float);
float operator$ (vector, vector);
vector operator* (float, vector);
vector operator* (vector, float);
};
vector::vector(float _x = 0, float _y = 0)
{
x = _x;
y = _y;
}
const float vector::operator$ (const vector &v1, const vector &v2)
{
return (v1.x * v2.x) + (v1.y * v2.y);
}
const vector vector::operator* (const float &m, const vector &v)
{
vector ret_val = v;
ret_val.x *= m;
ret_val.y *= m;
return ret_val;
}
const vector vector::operator* (const vector &v, const float &m)
{
return m * vector;
}
我的操作系统是
kubuntu 12.04
,我的 IDE 是 dev-C++
使用 wine windows 程序加载器在 linux 上运行。
因为您将
operator*()
定义为成员函数,所以已经有一个隐式参数:调用该方法的对象!因此,成员函数采用一个显式参数,而不是两个。
只需在类外声明您的运算符重载函数。另外,您返回的 const 可能不是您想要的。
class foo {
//code
};
foo operator*(foo& lhs, bar& rhs) const;
foo operator*(bar& lhs, foo& rhs) const;
chrisaycock给出的答案被接受,但这是错误的答案。该说法不正确。成员函数采用的显式参数的数量取决于函数所需的参数数量。
答案应该是:因为这个运算符*的左手操作数(const float &m, const vector &v)是一个float而不是一个vector对象,所以它不能是Vector类的成员函数。因此,这个函数被实现为 Complex 类之外的非成员函数/或者说 friend 函数。 const 向量 vector::operator* (const vector &v, const float &m) 也一样,不同的是现在浮动在右边。请验证
然而,类名“vector”与 具有相同名称的标准库类。 建议使用不同的类名, 例如“Vector2D”,以避免命名冲突。 此外,使用美元符号 ($) 作为点 产品运营商是非标准的,可能会造成混淆 对于其他程序员。建议使用 点运算符 (.) 代替。 这是更正后的代码:
#include <iostream>
#include <cstring>
class Vector2D {
public:
float x;
float y;
Vector2D(float, float);
float operator*(const Vector2D &) const;
friend Vector2D operator*(const Vector2D &, float);
friend Vector2D operator*(float, const Vector2D &);
};
Vector2D::Vector2D(float _x, float _y) {
x = _x;
y = _y;
}
float Vector2D::operator*(const Vector2D &v) const {
return (x * v.x) + (y * v.y);
}
Vector2D operator*(const Vector2D &v, float m) {
Vector2D ret_val = v;
ret_val.x *= m;
ret_val.y *= m;
return ret_val;
}
Vector2D operator*(float m, const Vector2D &v) {
return v * m;
}
int main() {
Vector2D v1(1, 2);
Vector2D v2(3, 4);
std::cout << "v1 dot v2 = " << v1 * v2 << std::endl;
Vector2D v3 = 2 * v1;
std::cout << "2 * v1 = (" << v3.x << ", " << v3.y << ")" << std::endl;
Vector2D v4 = v2 * 1.5;
std::cout << "v2 * 1.5 = (" << v4.x << ", " << v4.y << ")" << std::endl;
return 0;
}