2009-02-09 7 views
1

안녕하세요. 프리미티브 유형에 대해 연산자 < <을 과부하 할 수 있습니까? Fx는 int를 쓸 때마다 std :: endl을 작성한다고 말합니다. 자동으로 std :: endl을 출력하도록 int에 대해 < < 연산자를 오버로드 할 수 있습니까? 나는 이것을 시도했다.프리미티브 유형의 연산자 <<을 오버로딩합니다. 그게 가능하니?

std::ostream& operator<<(std::ostream& strm, int & i) 
{ 
    strm << i << std::endl; 
    return strm; 
} 

그러나 작동하지 않는다. 나는 컴파일러 오류 메시지를 회상 할 수는 없지만, 나는 연산자가 모든 잘못을 과부하시키고 있다고 생각한다. 나는 이런 식으로 위의 오버로드 된 연산자 < < 전화를

int main() 
{ 
    int i = 2; 
    std::out<<"Here is an int " << i; 

    return 0; 
} 

을 시도하지만 전혀 작동하지 않습니다. 어쩌면 POD 유형을 과부화 할 수 없습니까?

답변

2

cout을 zabzonk 말했듯이 다른를 정의 할 수 있도록, 표준 라이브러리는 (ostream에 &, int)에 과부하를 제공합니다.

은 : 현재의 형태로 완전히 무의미하지만 당신은 (무엇을하고 있는지 시뮬레이션 :

class EndlinedInteger { 
public: 
    EndlinedInteger(int i) : i(i) { } 
    friend ostream& operator<<(ostream&, EndlinedInteger const&); 
private: 
    int i; 
}; 

ostream& operator<<(ostream& out, EndlinedInteger const& ei) { 
    out << ei.i << endl; 
    return out; 
} 

int main() 
{ 
    EndlinedInteger i = 2; 
    std::cout<<"Here is an int " << i; 
} 
+1

예. 그것은 완전히 무의미합니다. 그러나 나는 내가 도중에 그것을 할 수 있는지 또는 내가 네 길에서 그것을해야만 하는지를 알지 못했다. 하지만 나는 다른 것을 시도하고 있습니다. – mslot

+0

그리고 boxed int의 생성자뿐만 아니라 모든 int 연산자를 제공해야합니다. – Muxecoid

+0

나는 단지 시연하고 있었음을 확신합니다. 어쨌든, 그것은 그가 boxed int로 무엇을하고 싶은지에 달렸습니다 :) –

2

int 에서뿐만 아니라 ostream에서도 < < 연산자를 사용한다는 것을 기억하십시오. 당신은 당신이 할 수 박스 INT 클래스를 만드는 표준 ostream에 대한 < < 및 박스 INT를 오버라이드 (ostream에에서 파생하고 자신의 파생 클래스에서 그것을 구현, 그러나 나는 또한

#define EL(i) (i)<<std::endl 

같은 간단한 매크로를 만들기 위해 제안 할 수 Iraimbilanja의 답변처럼). 거대한 잔인한 소리처럼 들리지만 작동 할 수 있습니다.

1

귀하의 문제는 운영자 < < (ostream에 &, INT)는 C++ 표준 라이브러리에서 제공하는 하나 이미 과부하 있다는 것입니다. 과부하 정의를 제거하고 사용하는 경우 :

#include <iostream> 
int main() 
{ 
    int i = 2; 
    std::out<<"Here is an int " << i; 

    return 0; 
} 

예상대로 작동합니다.

그리고 컴파일러 오류 메시지는 중요합니다. 따라서 질문을 할 때 컴파일러 오류 메시지를 기억하고 게시물에 인용하는 것이 좋습니다.

편집 - 표준 : 아웃 위 나오긴의 수 std한다 ::

+0

가 나는 오류가 컴파일러 인쇄 출력의 출력을 제공 할 수 있음을 죄송합니다. – mslot

+0

이것은 "append-an-endl"문제를 해결하지 않습니까? – xtofl

+0

아니요. 그것은 프로젝트와 관련하여 문제가있는 것과 관련이 없습니다. 오버로드하는 방법에 궁금한 점이 많았습니다. 가능하다면 원시 타입에 과부하가 걸렸습니다. – mslot