重载 * 运算符 - 必须采用零个或一个参数



我是重载运算符的新手,我做了一些搜索并找到了这篇有用的文章,我像作者一样编写了自己的代码,但我得到了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)也是如此,差异现在浮点在右侧。请核实

最新更新