我是重载运算符的新手,我做了一些搜索并找到了这篇有用的文章,我像作者一样编写了自己的代码,但我得到了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*()
定义为成员函数,所以已经有一个隐式参数:为其调用方法的对象!因此,成员函数采用一个显式参数,而不是两个。
只需在类外声明运算符重载函数即可。此外,您正在返回一个可能不是您想要的常量。
class foo {
//code
};
foo operator*(foo& lhs, bar& rhs) const;
foo operator*(bar& lhs, foo& rhs) const;
但是,类名"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;
}
Chrisaycock给出的答案被接受,但这是错误的答案。该语句不正确。成员函数采用的显式参数数取决于函数所需的参数数。
答案应该是:由于此运算符*(const float &m,const vector &v)的左侧操作数是浮点数而不是向量对象,因此它不能是 Vector 类的成员函数。因此,此函数在 Complex 类/或友元函数之外实现为非成员函数。常量向量向量::operator*(常量向量&v,常量浮点&m)也是如此,差异现在浮点在右侧。请核实