2011-02-09 3 views
1

친구 오퍼레이터 오버로드에 대해 혼란스러워합니다. 헤더 파일 내에 friend 연산자 오버로딩 함수를 작성하면 아무런 문제가 없지만 함수를 클래스 파일로 옮기면 다음과 같은 오류가 발생합니다. 내가 몇 가지 샘플을 봤 거든 그들은 모두 헤더 파일에 함수를 작성. 나는 무엇을 잘못 했는가? 감사. 당신이지고있어 오류 메시지에서C++ 친구 연산자 + 오버로드

...: 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

나는 이전 답변에 동의합니다. 또한, 내가 물을 수도 있습니다, 왜 함수를 friend 인수와 반환 유형이 같은 클래스의 경우? 첫 번째 인수가 this 연산자에 의해 암시 적으로 전달되도록 멤버로 만들지 않겠습니까?

+5

@ darkphoenix- (이것은 아마도 대답이 아닌 BTW의 의견으로 속합니다.) 'operator +'함수를 멤버 함수가 아닌 자유 함수로 만들면 다른 유형의 암시 적 변환이 'A'가되면 연산자가 고려 될 수 있습니다. 멤버 일 경우 첫 번째 피연산자가 'A'가 아닌 경우 함수를 찾을 수 없습니다. 클래스 데이터 멤버에 대한 액세스가 필요한 경우 '친구'가됩니다. – templatetypedef

0

두 개의 param 버전을 클래스 선언 밖으로 이동하십시오. 또는 하나의 매개 변수와이 포인터를 사용하십시오.

다음은 약식 실제 예입니다.

//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- C++ ISO 사양 13.5.6에서 : "연산자 함수는 ** 비 정적 ** 멤버 함수이거나 비 멤버 함수 여야하며 클래스 유형이 적어도 하나 인 매개 변수가 있어야합니다. 클래스, 열거 또는 열거 참조에 대한 참조입니다. " 실제로 오버로드 된 연산자를 정적으로 만들 수는없는 것처럼 보입니다.하지만 실제로 그렇게 생각하지는 못했습니다. – templatetypedef

+0

그렇게 할 수 있다고하더라도 이점은 무엇입니까? 회원 기능 버전이 잘못되었습니다. 왼쪽 피연산자를 수정합니다. operator +는 그렇게해서는 안됩니다. –

+0

첫 번째 반복이 잘못되었습니다. 위의 업데이트 된 버전. – selbie