Foward объявление boost :: interprocess :: ptree - PullRequest
2 голосов
/ 24 февраля 2012

Я хочу использовать предварительное объявление для класса ptree boost::property_tree.

Я использую 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 \ 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 Ответ

1 голос
/ 24 февраля 2012

Почему бы вам просто не включить 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;
  }
}
...