Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost.spirit.parser时无法破译编译错误_C++_Parsing_Boost - Fatal编程技术网

C++ 使用boost.spirit.parser时无法破译编译错误

C++ 使用boost.spirit.parser时无法破译编译错误,c++,parsing,boost,C++,Parsing,Boost,我正在尝试学习使用boost.spirit解析器进行解析。我正在将Windows 8.1与VisualStudio 2015配合使用。我已经安装并成功地编译了boost.spirit安装文档中的测试程序,因此我的boost安装看起来不错 我一直在关注boost.org上关于使用paser的教程。我创建了以下代码来解析double: #include <boost/config/warning_disable.hpp> #include <boost/spirit/inc

我正在尝试学习使用boost.spirit解析器进行解析。我正在将Windows 8.1与VisualStudio 2015配合使用。我已经安装并成功地编译了boost.spirit安装文档中的测试程序,因此我的boost安装看起来不错

我一直在关注boost.org上关于使用paser的教程。我创建了以下代码来解析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;
     }
#包括
#包括
#包括
#包括
#包括
名称空间qi=boost::spirit::qi;
名称空间ascii=boost::spirit::ascii;
模板
boolmyparser(迭代器优先,迭代器最后){
使用qi::double;
qi::规则myrule;
myrule%=双精度;
boolr=parse(first、last、myrule、ascii::space);
返回r;
}
int main(){
std::string dstr=std::string(“2.1”);
boolr=myParser(dstr.begin(),dstr.end());
返回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>> '   
“bool boost::function4::operator()(T0、T1、T2、T3)const”:无法将参数4从“const boost::spirit::unused_type”转换为“const boost::spirit::qi::char_class”

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

正如jv_在链接中提到的,您使用的是一个skipper,但没有调用将接受skipper的
短语解析
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;
}
#包括
模板bool myParser(迭代器优先,迭代器最后){
名称空间qi=boost::spirit::qi;
返回qi::parse(第一个、最后一个,qi::double_>>qi::eoi);
}
int main(){
标准:字符串常量dstr(“2.1”);
boolr=myParser(dstr.begin(),dstr.end());
返回r?0:1;
}

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

myrule%=double:-D。。。我迫不及待的想让升压精神达到标准C++库(不)。@ 6502为什么会发生这种情况(也就是说,选择EDSL语法的错误很小。<代码> %= 是奇怪的,但它的语义也是如此;根本没有理由使用它)感谢答覆和重写。虽然这对于分析double来说有些过分,但我有更复杂的需求,我想一个接一个地出错。现在,我在附加语义操作时遇到问题,但在请求帮助之前,我正在自己进行一些调试。