2

ptreeのクラスに前方宣言を使いたいboost::property_tree

私は Visual Studio 2010 とブースト バージョン 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\boost\1.48.0\32\boost\property_tree\ptree_fwd.hpp 95

(エラーの説明は異なる場合があります。イタリア語版の Visual Studio を使用しているため、翻訳しました)。

ptree_fwd.hpp でエラーが発生する行は次のとおりです。

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

代わりに、前方宣言を使用しない場合、すべてがうまくいき、正常にコンパイルされます。

私が間違っていることと、この場合に前方宣言を正しく使用するにはどうすればよいですか?

4

1 に答える 1

3

を含めてみません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;
  }
}
于 2012-02-24T15:55:03.713 に答える