错误C2804:二进制'operator +'有太多参数(用VC 120编译)

时间:2016-03-11 15:05:58

标签: c++ operator-overloading operators

编写我自己的矢量类(用于游戏引擎)并在Visual Studio 2013 CPlusPlus项目中重载'+'运算符(使用VC运行时120),它给我带来了编译错误:

  

错误:此操作员功能的参数太多。

以下Vector.hpp文件中的代码段。

Vector.hpp

class Vector
{
private:
    double i;
    double j;
    double k;
public:
    Vector(double _i, double _j, double _k)
    {
        i = _i;
        j = _j;
        k = _k;
    }

    Vector& operator+=(const Vector& p1)
    {
        i += p1.i;
        j += p1.j;
        k += p1.k;
        return *this;
    }

    //Some other functionality...

    Vector operator+(const Vector& p1, Vector& p2) //Error is thrown here...
    {
        Vector temp(p1);
        return temp += p2;
    }
};

enter image description here

我在这里做错了什么?不想让我的运算符超载非成员函数。

2 个答案:

答案 0 :(得分:12)

在类中定义operator+时,运算符的左操作数是当前实例。因此,要声明operator+的重载,您有2个选择

  • 内部类,只有一个参数是右操作数
  • 在课外,有两个参数,左右操作数。

选择1:课外

class Vector
{
private:
    double i;
    double j;
    double k;
public:
    Vector(double _i, double _j, double _k)
    {
        i = _i;
        j = _j;
        k = _k;
    }

    Vector& operator+=(const Vector& p1)
    {
        i += p1.i;
        j += p1.j;
        k += p1.k;
        return *this;
    }

    //Some other functionality...


};

Vector operator+(const Vector& p1, const Vector& p2)
{
    Vector temp(p1);
    temp += p2;
    return temp;
}

选择2:内部课程

class Vector
{
private:
    double i;
    double j;
    double k;
public:
    Vector(double _i, double _j, double _k)
    {
        i = _i;
        j = _j;
        k = _k;
    }

    Vector& operator+=(const Vector& p1)
    {
        i += p1.i;
        j += p1.j;
        k += p1.k;
        return *this;
    }



    Vector operator+(consr Vector & p2)
    {
        Vector temp(*this);
        temp += p2;
        return temp;
    }

};

您可以在此处查看如何声明运算符:C/C++ operators

答案 1 :(得分:1)

另一种可能性是使用friend关键字。

friend Vector operator+(const Number& n1, const Number& n2)
    {
        Vector temp(n1);
        temp+=n2;
        return temp;
    }