2011-09-27 3 views
1

다음 예제 고려 :boost :: property_tree에 객체를 추가하는 올바른 방법은 무엇입니까?

#include <boost\property_tree\ptree.hpp> 
#include <boost/any.hpp> 

typedef boost::property_tree::ptree PT; 

struct Foo 
{ 
    int bar; 
    int egg; 
    Foo(): bar(), egg() {} 
}; 


int main() 
{ 
    Foo foo; 
    foo.bar = 5; 
    PT pt; 
    pt.put<Foo>("foo", foo); 
    return 0; 
} 

나는 높일 새로운 그리고 난 속성 트리에 푸 개체를 넣어 기꺼이.

c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/boost/property_tree/stream_translator.hpp:33:13: error: no match for 'operator<<' in 's << e'

은 누구나 할 수있는 올바른 방법을 제안 할 수 있습니다 : 위의 예는 오류를주고 컴파일되지 않습니다?

답변

3

Foo 오브젝트 유형에 대해 과부하 된 operator<<을 작성하기 만하면됩니다. 이것은 Foo 오브젝트 유형의 멤버를 가져와 operator<<을 통해 ostream 오브젝트 유형을 통해 전달하는 함수를 작성하여 수행 할 수 있습니다. 다음은 아주 간단한 예입니다

당신이 당신의 Foo 객체 유형의 구성원으로 사용하는 int 유형 ostreamint에 대한 operator<<의 오버로드 된 버전을 호출하기 때문에이 작동
ostream& operator<<(ostream& out, Foo output_object) 
{ 
    out << egg << " " << bar; 
    return out; 
} 

. 따라서 Foo 유형의 객체가 이미 오버로드되지 않은 경우 해당 유형에 대해서도 오버로드 된 operator<< 함수를 만들어야합니다. 이 번

은 당신의 코드가 어느 곳과 같이 호출 할 수 있습니다, 수행됩니다 피연산자뿐만 아니라 제대로 작동하므로

Foo test; 
cout << test; //will print out whatever the values of "egg" and "bar" are 

또한, 시도한다 다른 코드가 ostream 객체와 Foo 유형 operator<<를 사용하는 .

마지막으로 오버로드 된 함수를 사용하여 헤더 파일에 배치하거나 함수 선언을 헤더에 만든 다음 다른 곳의 코드 모듈에서 함수를 정의 할 수 있습니다.

+0

그렇다면이 객체로 다른 목적으로 연산자 << std :: ostream'가 오버로드 된 경우 정확히 무엇을해야할까요? 'property_tree'에 저장하는 형식이 표시 목적으로 인쇄하는 것과 다르게 보일 때처럼? –

+0

@ NicolBolas : 다른 옵션이 있습니까? std :: ostream에 대해 operator <<를 두 번 오버로드하거나, boost :: property_tree의 특정 인스턴스에 대해 하나, std :: cout에 대해 다른 인스턴스를 오버로드 할 수있는 방법은 없습니다. 내가 생각할 수있는 유일한 것은'boost :: property_tree'가 I/O에 사용하는 파생 클래스의 유형이 있는지 조사하는 것입니다.이 파생 클래스를 사용하면 'operator <<'의보다 구체적인 오버로드를 생성하는 데 사용할 수 있습니다. 그렇지 않으면 다른 클래스에서'std :: cout'을 래핑 할 수 있고'Foo' 클래스와'std :: cout' 래퍼를 위해'operator <<'를 오버로드 할 수 있습니다. 다른 옵션은 없습니까? – Jason

관련 문제