2016-03-11 1 views
2

Написание собственного класса векторов (для игрового движка) и перегрузка оператора «+» в проекте Visual Studio 2013 CPlusPlus (с использованием среды выполнения VC 120) , он бросает мне компилятор ошибки:ошибка C2804: двоичный 'оператор +' имеет слишком много параметров (компиляция с VC 120)

Error: too many parameters for this operator function.

фрагмент кода из файла 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

Что я здесь делаю неправильно? Не хотите, чтобы мой оператор перегружал функцию, отличную от члена.

+1

'Вектор оператор + (сопзЬ Вектор & p1, Vector & p2)' должен быть объявить вне класса – Garf365

+1

как функции члена он имеет 'this' неявно в качестве первого параметра, но вы хотите поставить больше два – user463035818

ответ

6

Когда 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

0

один больше возможностей b y используя ключевое слово friend.

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

 Смежные вопросы

  • Нет связанных вопросов^_^