2011-02-09 4 views
1

Я смущен перегрузкой оператора. У меня нет проблем, если я напишу функцию перегрузки оператора друга в файле заголовка, но он дает мне следующие ошибки, как только я переместил функцию в файл класса. Я искал несколько образцов, и все они записывали функцию в файл заголовка. Что я сделал не так? Благодарю.Оператор со ++ друга + перегрузка

...: error: expected ‘,’ or ‘...’ before ‘&’ token 
...: error: ISO C++ forbids declaration of ‘statisticain’ with no type 
...: error: ‘main_savitch_2C::statistician operator+(int)’ must have an argument of class or enumerated type 


// a.h 
class A 
{ 
    public: 
     friend A operator + (const A &a1, const A &a2); 
}; 

// a.cpp 
#include "a.h" 
A operator + (const A &a1, const A &a2) 
{ 
    // 
} 
+0

Этот код отлично подходит для меня. Как выглядит ваш ** настоящий ** код? –

+1

Поскольку каждый дает советы о том, как правильно перегрузить оператора +, [здесь] (http://codepad.org/8E9m5A7a), мой совет. –

ответ

3

Из сообщения об ошибке вы получаете:

ISO C++ forbids declaration of ‘statisticain’ with no type 

Я думаю, что вы неправильно «статистик», поменяв две последние буквы (обратите внимание, что у вас есть «statisticain» вместо «статист. ")

Это не должно иметь никакого отношения к тому, реализован ли operator+ в заголовке или в файле .cpp.

+0

О да, я не читал сообщение об ошибке. Большое спасибо. – Kyeteko

1

Я согласен с предыдущим ответом. Кроме того, если я могу спросить, зачем делать функцию a friend, когда оба аргумента и тип возврата имеют один и тот же класс? почему бы не сделать его членом, поэтому первый аргумент передается неявно оператором this?

+5

@ darkphoenix- (Вероятно, это скорее комментарий, чем ответ, BTW). Вы должны сделать функцию 'operator +' свободной функцией, а не функцией-членом, так что если есть неявные преобразования из другого типа в 'A', тогда оператор может быть рассмотрен. Если бы это был член, то если первый операнд не был 'A', функция не была бы найдена. Это был бы «друг», если бы ему нужен доступ к элементам данных класса. – templatetypedef

0

Переместить две версии параметров из объявления класса. Или просто используйте один параметр и этот указатель.

Вот пример примера с сокращенным примером.

//complexnumber.h 
    class ComplexNumber 
    { 
     float _r; 
     float _i; 

     friend ComplexNumber operator+(const ComplexNumber&, const ComplexNumber&); 

     public: 
      ComplexNumber(float real, float img):_r(real),_i(img) {} 
      ComplexNumber& operator + (const ComplexNumber &other); 
    }; 

    ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2); 


//complexnumber.h 
    ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2) 
    { 
     return ComplexNumber(c1._r+c2._r, c1._i+c2._i); 
    } 


    // static 
    ComplexNumber& ComplexNumber::operator + (const ComplexNumber &other) 
    { 
     this->_r = this->_r + other._r; 
     this->_i = this->_i + other._i; 

     return *this; 

    } 
+0

@ selbie- Из спецификации ISO C++, 13.5.6: «Операторная функция должна быть либо ** нестатической ** функцией-членом, либо быть не-членной функцией и иметь хотя бы один параметр, тип которого является классом, ссылку на класс, перечисление или ссылку на перечисление ». Похоже, вы на самом деле не можете сделать перегруженные операторы статичными, хотя я и не подозревал, что это так, пока я не посмотрел. – templatetypedef

+0

Даже если бы вы могли это сделать, каково было бы преимущество? И ваша версия функции члена очень неправильная. Он изменяет его левый операнд. оператор + не должен этого делать. –

+0

К сожалению, моя первая итерация неверна. Обновленная версия выше. – selbie