Boost Xpressive - поле "m_rx" имеет неполный тип - PullRequest
0 голосов
/ 11 марта 2019

У меня проблемы с компиляцией заголовка класса, который содержит поле члена типа sregex.

Класс определяется как:

#include <boost/xpressive/xpressive_fwd.hpp>
namespace Bob
{

class RegexReplace
{
public :
    boost::xpressive::sregex m_rx;
    std::string m_str;

    RegexReplace(const char* strSearch, const char* strReplace);
};

} // namespace Bob

Файл класса cpp компилируется без проблем, но когда я включаю заголовок в файл cpp, который использует класс, компилятор выдает следующую ошибку:

error: field ‘m_rx’ has incomplete type ‘boost::xpressive::sregex’ {aka ‘boost::xpressive::basic_regex<__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> > >’}
boost::xpressive::sregex m_rx;

Что я тут не так делаю ???

1 Ответ

0 голосов
/ 11 марта 2019

boost::xpressive::sregex m_rx; является экземпляром, и вы только направили его вперед, включив ..._fwd.hpp, другими словами, он неполон.

#include <boost/xpressive/xpressive.hpp> должен решить проблему.

Если вы действительно хотите перенаправить объявление вашего типа, вам придется изменить его на указатель (нерабочий код, похоже, что boost использует static :: compile (...)):

HPP:

#include <boost/xpressive/xpressive_fwd.hpp>
namespace Bob
{

class RegexReplace
{
public :
    boost::xpressive::sregex* m_rx;
    std::string m_str;

    RegexReplace(const char* strSearch, const char* strReplace);
    ~RegexReplace();

    // @todo Implement move and copy semantics
};

} // namespace Bob

касты:

#include <boost/xpressive/xpressive.hpp>
namespace Bob
{
  RegexReplace::RegexReplace(const char* strSearch, const char* strReplace) :
    m_rx{new boost::xpressive::sregex}
  {
    ......
  }

  RegexReplace::~RegexReplace() {
    delete m_rx;
  }
}
...