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 
} 

私の.cppファイル内のクラスを使用し、その後、私の.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_ 

を次のように前方宣言を行います次のエラーを取得します。

エラー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; 

です。

私は間違って何をしていますか、このケースでは前方宣言を正しく使用する方法はありますか?

+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

関連する問題