Boost Xpressive-字段“ m_rx”的类型不完整

时间:2019-03-11 08:11:52

标签: c++ boost boost-xpressive

我无法编译包含类型为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 :(得分:0)

boost::xpressive::sregex m_rx;是一个实例,您只能通过包含..._fwd.hpp来进行声明,也就是说,它是不完整的。

#include <boost/xpressive/xpressive.hpp>应该可以解决问题。

如果您真的要转发声明您的类型,则必须将其更改为指针(非工作代码,看起来boost使用了静态:: 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

cpp:

#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;
  }
}