使用boost.spirit.parser时无法解密编译错误

时间:2016-05-31 06:30:47

标签: c++ parsing boost

我正在尝试学习使用boost.spirit解析器进行解析。我在Visual Studio 2015中使用Windows 8.1。我已经安装并成功编译了boost.spirit安装文档中的测试程序,因此我的boost安装似乎很好。

我一直在使用paser关注boost.org上的教程。我创建了以下代码来解析double:

  #include <boost/config/warning_disable.hpp>
  #include <boost/spirit/include/qi.hpp>
  #include <boost/spirit/include/phoenix_core.hpp>
  #include <boost/spirit/include/phoenix_operator.hpp>
  #include <boost/spirit/include/phoenix_object.hpp>

  namespace qi = boost::spirit::qi;
  namespace ascii = boost::spirit::ascii;

  template <typename Iterator>
  bool myParser(Iterator first, Iterator last) {
      using qi::double_;
      qi::rule<Iterator, double(), ascii::space_type> myrule;
      myrule %= double_;
      bool r = parse(first, last, myrule, ascii::space);
      return r;
   }
  int main() {
      std::string dstr = std::string("2.1");
      bool r = myParser(dstr.begin(), dstr.end());
      return 0;
     }

编译时,我从rule.hpp第304行收到以下错误消息:

'bool boost::function4<R,T0,T1,T2,T3>::operator ()(T0,T1,T2,T3) const': cannot convert argument 4 from 'const boost::spirit::unused_type' to 'const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space,boost::spirit::char_encoding::ascii>> '   

任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:2)

如链接中的jv_所述,您使用的是一个队长,但没有调用接受队长的phrase_parse API。因此,parse调用尝试将ascii::space解析器绑定到第一个公开的属性(double)。

该任务失败。

很可能你不想要这个简单语法的队长,我写道:

#include <boost/spirit/include/qi.hpp>

template <typename Iterator> bool myParser(Iterator first, Iterator last) {
    namespace qi = boost::spirit::qi;
    return qi::parse(first, last, qi::double_ >> qi::eoi);
}

int main() {
    std::string const dstr("2.1");
    bool r = myParser(dstr.begin(), dstr.end());
    return r?0:1;
}

请注意qi::eol检查是否已消耗所有输入。