【问题标题】:error C2804: binary 'operator +' has too many parameters (compiling with VC 120)错误 C2804:二进制 'operator +' 参数过多(使用 VC 120 编译)
【发布时间】:2016-06-26 21:27:27
【问题描述】:

在 Visual Studio 2013 CPlusPlus 项目中编写我自己的矢量类(用于游戏引擎)并重载“+”运算符(使用 VC 运行时 120),这会引发编译器错误:

错误:此运算符函数的参数过多。

下面Vector.hpp文件中的代码sn-p。

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;
    }
};

我在这里做错了什么?不想让我的操作符重载非成员函数。

【问题讨论】:

  • Vector operator+(const Vector& p1, Vector& p2) 应该被声明出类
  • 作为一个成员函数,它有this隐式作为第一个参数,但你想再提供两个

标签: c++ operator-overloading operators


【解决方案1】:

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+(const Vector & p2)
    {
        Vector temp(*this);
        temp += p2;
        return temp;
    }

};

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这不回答问题。这里不是关于友谊的问题。此外,您的友好声明不正确 => 在类内声明为朋友,使用 friend 关键字后跟仅声明和编写类外函数的实现,没有 friend 关键字。最后,恕我直言,只有在需要时才使用friend,而这里不需要
    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多