首页 > 解决方案 > Boost Xpressive - 字段“m_rx”的类型不完整

问题描述

我在编译包含类型成员字段的类头时遇到问题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;

我在这里做错了什么???

标签: c++boostboost-xpressive

解决方案


boost::xpressive::sregex m_rx;是一个实例化,您只能通过 include 向前声明它..._fwd.hpp,换句话说,它是不完整的。

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

如果您真的想转发声明您的类型,则必须将其更改为指针(非工作代码,看起来 boost 使用静态 ::compile(...)):

惠普:

#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

cp:

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

推荐阅读