2014-02-06 6 views
1

저는 온라인 비디오에서 배우려고 C++ 초보자입니다. 강의에있는 연산자 오버로드 예제에서 다음 코드가 있으며 오류가 발생했습니다.<< C++에서 연산자 오버로드 오류

error: no match for 'operator<<' in 'std::cout << operator+(((point&)(& p1)), ((point&)(& p2)))'compilation terminated due to -Wfatal-errors. 

줄에 주석이 표시되어 있습니다. 누군가 코드에서 무엇이 잘못되었는지 말할 수 있습니까? 나는 교수가 강연에서 설명했던 것을 시도하고 있지만 컴파일 할 수는 없다.

===============

#include <iostream> 
using namespace std; 


class point{ 
public: 
    double x,y; 
}; 

point operator+ (point& p1, point& p2) 
{ 
    point sum = {p1.x + p2.x, p1.y + p2.y}; 
    return sum; 
} 

ostream& operator<< (ostream& out, point& p) 
{ 
    out << "("<<p.x<<","<<p.y<<")"; 
    return out; 
} 


int main(int argc, const char * argv[]) 
{ 
    point p1 = {2,3}; 
    point p2 = {2,3}; 
    point p3; 
    cout << p1 << p2; 

    cout << p1+p2; // gives a compliation error 
    return 0; 
} 
+0

모두에게 감사드립니다. 그게 효과가 있었어. – kaushal

답변

3

그냥 const 정확성에 문제가 있습니다. 연산자 +가 임시를 반환하므로 operator<<을 호출 할 때 const 참조를 바인딩 할 수 없습니다. 이 컴파일 오류를 해결하기 위해 그것을 할 필요는 없지만 당신이 유사 operator+를 해결하지 않는 한

ostream& operator<< (ostream& out, const point& p) 

, 당신은 const 포인트를 추가 할 수 없습니다 : 서명을 확인

point operator+(const point& p1, const point& p2) 
+0

"연산자 +가 임시를 반환하므로 연산자 <<"를 호출 할 때 const가 아닌 참조를 바인딩 할 수 없습니다. 분명하지 않습니다. C++ 표준 어딘가에 있습니까? –

+0

자세한 설명은 Tony에게 감사드립니다. – kaushal

+0

@SergiiKhaperskov : 8.5.3/5에 설명되어 있습니다. "그렇지 않은 경우 참조는 비 휘발성 const 유형 (예 : cv1은 const이어야 함)에 대한 좌변 값 참조이거나 참조가 rvalue 참조가되어야합니다."를 참조하십시오. 및 예제 "double & rd2 = 2.0; // 오류 : lvalue 및 참조가 아닌 const". –

0

변경 operator+operator<<에 대한 const point&-point&에서 매개 변수 유형. 비 const 참조는 (operator+에 의해 반환되는) 임시에 바인딩 할 수없고 컴파일 오류의 원인이됩니다.

+0

설명해 주셔서 감사합니다. 당신이 먼저 대답했습니다! :) – kaushal

0

그 이유는 두 번째 매개 변수가 const 참조 여야하기 때문입니다. (수정되지 않았 으면 좋겠습니까?) 그렇다면,

std::ostream& operator<< (std::ostream &out, const Point &p) 
{ 
    out << "(" << p.x << ", " << p.y << ")"; 

    return out; 
}