2012-02-24 40 views
2

我想使用ptreeboost::property_tree的前向聲明。Foward聲明boost :: interprocess :: ptree

我使用Visual Studio 2010和boost版本1.48.0。

我向前聲明以下面的方式,在我的.h

#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_ 

然後,我用我的類的.cpp

#include <boost/property_tree/ptree.hpp> 

using boost::property_tree::ptree; 

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

    // other stuff 
} 

裏面,當我嘗試編譯它,我獲取以下錯誤

錯誤C2371:'boost :: property_tree :: ptree':重新定義。不同的基本類型。 C:\ LIB \提升\ 1.48.0 \ 32 \提升\ property_tree \ ptree_fwd.hpp 95

(錯誤描述可以是不同的,我把它翻譯,因爲我的Visual Studio的意大利版)。

,讓我的錯誤,在ptree_fwd.hpp線,如下

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

相反,如果我不使用前聲明,一切順利的話,我成功編譯它。

我在做什麼錯了,以及我在這種情況下如何正確使用前向聲明?

+1

'ptree'不是類,但一個'typedef'(即另一種類型的別名)。這意味着當您嘗試轉發聲明時,您將其作爲類來執行,並且類和typedef將發生衝突。 – 2012-02-24 15:40:45

+0

所以我必須轉發basic_ptree模板? – Jepessen 2012-02-24 15:52:36

+0

@JoachimPileborg你爲什麼評論而不是回答? – 2012-02-24 15:55:10

回答

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

如果您不必在標題中包含標題,則最好不要。 – 2012-02-24 15:55:48

+0

因爲我編譯速度更快,如果別人必須使用我的庫,我不需要包含這些增強標題。 – Jepessen 2012-02-24 16:05:39

+0

@LuchianGrigore真的。它也看起來像標題拉着一些不需要的東西,比如'optional_fwd.hpp'。 – pmr 2012-02-24 16:09:32

相關問題