2010-04-27 15 views
3

구조체가 'std :: cout'또는 다른 출력 스트림을 사용하여 출력하고 싶습니다. 클래스를 사용하지 않고 이것이 가능합니까?"<<"struct (no class) cout 스타일로 오버로드하기

감사

#include <iostream> 
#include <fstream> 
template <typename T> 
struct point{ 
    T x; 
    T y; 
}; 

template <typename T> 
std::ostream& dump(std::ostream &o,point<T> p) const{ 
    o<<"x: " << p.x <<"\ty: " << p.y <<std::endl; 
} 


template<typename T> 
std::ostream& operator << (std::ostream &o,const point<T> &a){ 
    return dump(o,a); 
} 


int main(){ 
    point<double> p; 
    p.x=0.1; 
    p.y=0.3; 
    dump(std::cout,p); 
    std::cout << p ;//how? 
    return 0; 
} 

나는 다른 구문을 시도 '하지만 난 그것을 작동하게하는 것 캔트.

+4

"클래스를 사용하지 않음"은이 경우 특히 유용한 한정자가 아닙니다. struct가 public 멤버/상속을 기본적으로 제외하고 클래스는 기본적으로 private이므로 구조체와 클래스 간에는 기능상의 차이점이 없습니다. –

답변

9

아마도 복사 - 붙여 넣기 오류 일 수도 있지만 몇 가지 문제가 있습니다. 첫째, 자유 함수는 const 일 수 없지만 dump을 이와 같이 표시했습니다. 두 번째 오류는 dump 값을 반환하지 않으며 쉽게 해결할 수 있습니다. 사람들을 수정하고 작동한다 : 모든 의도와 목적을 위해

template <typename T> // note, might as well take p as const-reference 
std::ostream& dump(std::ostream &o, const point<T>& p) 
{ 
    return o << "x: " << p.x << "\ty: " << p.y << std::endl; 
} 
+0

덕분에 이전 클래스에서 실제로 복사하여 붙여 넣었습니다 – monkeyking

+0

세 번째는 덤프 할 지점이 'const'로 표시되지 않았다는 것입니다. GMan도이를 수정했습니다. – sbi

7

을, 구조체 대신 개인의 대중에게 자신의 회원은 기본적 것을 제외하고 C++에서 클래스입니다. 최적화 때문에 약간의 구현에 따른 차이가있을 수 있지만 C++의 클래스 및 구조체와 동일한 표준 기능에는 영향을 미치지 않습니다.

둘째, "덤프"기능을 사용하는 이유는 무엇입니까? 그냥 스트림 운영자에게 직접 구현하십시오.

template<typename T> 
std::ostream& operator << (std::ostream &o, const point<T> &a) 
    { 
    o << "x: " << a.x << "\ty: " << a.y << std::endl; 
    return o; 
    } 
관련 문제