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

问题描述 投票:0回答:4

我是重载运算符的新手,我做了一些搜索并找到了这篇有用的文章,我像作者那样编写了自己的代码,但是我得到了

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 上运行。

c++ operator-overloading
4个回答
22
投票

因为您将

operator*()
定义为成员函数,所以已经有一个隐式参数:调用该方法的对象!因此,成员函数采用一个显式参数,而不是两个。


13
投票

只需在类外声明您的运算符重载函数。另外,您返回的 const 可能不是您想要的。

class foo {
  //code
};

foo operator*(foo& lhs, bar& rhs) const;
foo operator*(bar& lhs, foo& rhs) const;

0
投票

chrisaycock给出的答案被接受,但这是错误的答案。该说法不正确。成员函数采用的显式参数的数量取决于函数所需的参数数量。

答案应该是:因为这个运算符*的左手操作数(const float &m, const vector &v)是一个float而不是一个vector对象,所以它不能是Vector类的成员函数。因此,这个函数被实现为 Complex 类之外的非成员函数/或者说 friend 函数。 const 向量 vector::operator* (const vector &v, const float &m) 也一样,不同的是现在浮动在右边。请验证


0
投票

然而,类名“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;
}
© www.soinside.com 2019 - 2024. All rights reserved.