2012-02-24 4 views
2

ptree 클래스의 전달 선언을 boost::property_tree으로 사용하고 싶습니다.boost :: interprocess :: ptree의 Foward 선언

Visual Studio 2010을 사용하고 버전 1.48.0을 사용합니다.

나는 내가 컴파일 할 때 내 통화 당

#include <boost/property_tree/ptree.hpp> 

using boost::property_tree::ptree; 

Options::Options() 
{ 
    m_pxPropertyTree = new ptree(); 

    // other stuff 
} 

내부 클래스를 사용,

#ifndef OPTIONS_H_ 
#define OPTIONS_H_ 

namespace boost 
{ 
    namespace property_tree 
    { 
     class ptree; 
    } 
} 

class Options 
{ 
    // something 

private: 
    boost::property_tree::ptree *m_pxPropertyTree; 
}; 

#endif // OPTIONS_H_ 

그럼 내 .H에서, 다음과 같은 방법으로 전방 선언을 할 다음 오류를 얻으십시오.

오류 C2371 : 'boost :: property_tree :: ptree': 재정의. 다른 기본 유형. c : \ lib \ boost \ 1.48.0 \ 32 \ boost \ property_tree \ ptree_fwd.hpp 95

(오류 설명이 다를 수 있습니다.).

ptree_fwd.hpp에, 나에게 오류를 제공 라인, 나는 전방 선언을 사용하지 않으면, 모든 것이 잘 어울리는 나는 성공적으로 컴파일, 대신 다음

typedef basic_ptree<std::string, std::string> ptree; 

입니다.

내가 뭘 잘못하고 있으며,이 경우 올바르게 전달 선언을 어떻게 사용할 수 있습니까?

+1

'ptree'는 클래스 아니지만,'typedef' (다른 유형의 즉 별칭). 이것은 클래스로 선언을 전달하려고 할 때 클래스와 타입 정의가 충돌 할 것임을 의미합니다. –

+0

그래서 basic_ptree 템플릿을 클래스 전달해야합니까? – Jepessen

+0

@JoachimPileborg 왜 대답 대신 대답하셨습니까? –

답변

1

boost/property_tree/ptree_fwd.hpp 만 포함하면 되나요? 이 헤더에는 패키지의 모든 전달 선언이 포함됩니다.

편집 : 포함되지 않은 솔루션 (좋은 이유는 을 피하기를 원합니다)은 실제로 선언 된 것과 정확하게 일치시키는 것입니다.

그래서 :

#include <string> 
#include <functional> 
namespace boost 
{ 
    namespace property_tree 
    { 
    template < class Key, class Data, class KeyCompare > 
    class basic_ptree; 

    typedef basic_ptree< std::string, std::string, std::less<std::string> > ptree; 
    } 
} 
+0

헤더에 헤더를 포함 할 필요가없는 경우 더 좋을 것입니다. –

+0

컴파일이 더 빠르며 누군가 다른 사람이 내 라이브러리를 사용해야하는 경우 해당 부스트 헤더를 포함 할 필요가 없습니다. – Jepessen

+0

@LuchianGrigore True. 헤더가'optional_fwd.hpp'를 좋아하는 불필요한 것들을 사용하고있는 것처럼 보입니다. – pmr