2012-05-25 15 views
1

최근에 연산자 오버로드를 시도했으며 연산자 오버로딩에 대한이 stackoverflow 페이지 (http://stackoverflow.com/questions/4421706/operator-overloading)를 살펴 보았습니다. 나는 * 연산자를 오버로드하고 여기에오버로드 된 연산자 << 연산자 사용시 오류 *

std::cout << a*b; 

과 같은 코드를 실행하면 컴파일 타임 오류 error: invalid operands to binary expression ('basic_ostream<char, std::char_traits<char> >' and 'Vector2')

Vector2 a(2, 3); 
Vector2 b(5, 8); 
Vector2 c = a*b; 

과 같은 코드를 실행하지만, 얻을 수

는 Vector2입니다. cpp

#include "Vector2.h" 

Vector2::Vector2(const float x, const float y) { 
    this->x = x; 
    this->y = y; 
} 

Vector2 &Vector2::operator*=(const Vector2 &rhs) { 
    this->x *= rhs.x; 
    this->y *= rhs.y; 
    return *this; 
} 

std::ostream &operator<< (std::ostream &out, Vector2 &vector) { 
    return out << "(" << vector.x << ", " << vector.y << ")"; 
} 

여기에 내가 당장은 확실하지 않다 Vector2.h

#include <iostream> 

class Vector2 { 
    public: 
     float x; 
     float y; 

     Vector2(const float x, const float y); 
     Vector2 &operator*=(const Vector2 &rhs); 
}; 

inline Vector2 operator*(Vector2 lhs, const Vector2 &rhs) { 
    lhs *= rhs; 
    return lhs; 
} 

std::ostream &operator<<(std::ostream &out, Vector2 &vector); 

입니다.

+0

은 괄호를 사용하여 검사 한? – betabandido

+0

예, 제가 시도한 첫 번째 시도 였지만 작동하지 않았습니다. – rabbidrabbit

+1

다음과 같은 이유가 있습니다. http://en.cppreference.com/w/cpp/language/operator_precedence – chris

답변

6

문제는

a*b 

임시을 반환, 그래서 당신이 필요합니다 임시로

std::ostream &operator<<(std::ostream &out, const Vector2 &vector); 
//           | 
//          notice const             

는 const가 아닌 참조에 바인딩 할 수 없습니다.

+1

두 번째 요점은 무엇입니까? 그가 가진 방식은 완벽합니다. 어쨌든 객체의 사본을 만들어야하므로 매개 변수 목록에서 확인하십시오. –

+0

고맙습니다. 그 말이 완벽합니다. – rabbidrabbit

+0

@BenjaminLindley 왜 개체에 복사본을 만드시겠습니까? –

0

다음 작업을해야합니다 : 'cout과 << (A * 나)`:

Vector2 c = a*b; 
std::cout << c; 
+0

예, 작동합니다. 내가 뭘하려고하면 std :: cout << a * b; – rabbidrabbit

+0

그런 다음 연산자 인수를 업데이트하여 const 인수를 다른 인수로 제안해야합니다. –