2012-02-24 47 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

相关问题