Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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::phoenix::bind和boost::spirit::qi::symbols::add_C++_Boost_Boost Spirit_Boost Spirit Qi_Boost Phoenix - Fatal编程技术网

C++ 使用boost::phoenix::bind和boost::spirit::qi::symbols::add

C++ 使用boost::phoenix::bind和boost::spirit::qi::symbols::add,c++,boost,boost-spirit,boost-spirit-qi,boost-phoenix,C++,Boost,Boost Spirit,Boost Spirit Qi,Boost Phoenix,我想解析文本文件中的浮点数,并将其插入符号表中;解析器和符号表由spirit::qi提供 这是我的密码: #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> #include <stdint.h> #include <iostream> #include <string> template<typename VTYP

我想解析文本文件中的浮点数,并将其插入符号表中;解析器和符号表由spirit::qi提供

这是我的密码:

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

#include <stdint.h>
#include <iostream>
#include <string>
template<typename VTYPE>
struct VTable : boost::spirit::qi::symbols<char, VTYPE> {
    VTable() {} // empty
};

int main() {
using boost::spirit::qi::_1;
using boost::spirit::qi::eps;
using boost::spirit::qi::rule;
using boost::spirit::qi::ascii::space;
using boost::spirit::qi::space_type;
using boost::spirit::qi::real_parser;
using boost::spirit::qi::int_parser;
using boost::spirit::qi::strict_real_policies;
    VTable<double> floatDecs;
    floatDecs.add("hallo", 15.26)("duDa", 18.5);

const std::string some = "some";
    rule<std::string::iterator, double> value = real_parser<double, strict_real_policies<double>>() [ boost::phoenix::bind(&VTable<double>::add, floatDecs, boost::phoenix::cref(some), _1) ];

    std::cout << boost::spirit::qi::phrase_parse(test.begin(), test.end(), value, space);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
模板
结构VTable:boost::spirit::qi::symbols{
VTable(){}//空
};
int main(){
使用boost::spirit::qi::_1;
使用boost::spirit::qi::eps;
使用boost::spirit::qi::rule;
使用boost::spirit::qi::ascii::space;
使用boost::spirit::qi::space\u type;
使用boost::spirit::qi::real\u解析器;
使用boost::spirit::qi::int\u解析器;
使用boost::spirit::qi::严格的政策;
可变浮点数;
增加(“你好”,15.26)(“杜达”,18.5);
const std::string some=“some”;
rule value=real_parser()[boost::phoenix::bind(&VTable::add,floatDecs,boost::phoenix::cref(some),\u 1)];

std::cout这是一个有效的版本。之后,我会列出你的错误

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

#include <stdint.h>
#include <iostream>
#include <string>
template<typename VTYPE>
struct VTable : boost::spirit::qi::symbols<char, VTYPE> {
    VTable() {} // empty
};

int main() {
using boost::spirit::qi::_1;
using boost::spirit::qi::eps;
using boost::spirit::qi::rule;
using boost::spirit::qi::ascii::space;
using boost::spirit::qi::space_type;
using boost::spirit::qi::real_parser;
using boost::spirit::qi::int_parser;
using boost::spirit::qi::strict_real_policies;

    VTable<double> floatDecs;
    floatDecs.add("hallo", 15.26)("duDa", 18.5);

    const char some[] = "some";

    rule<std::string::iterator, double()> value =
            real_parser<double, strict_real_policies<double> >()
            [ boost::phoenix::bind(floatDecs.add, boost::phoenix::val(some), _1) ];

    std::string test("10.6");

    std::string::iterator b(test.begin()), e(test.end());

    std::cout << boost::spirit::qi::phrase_parse(b, e, value, space);

    return 0;
}
接下来,您需要修复规则模板参数中的语法:

rule<std::string::iterator, double()>
老实说,我不知道为什么会这样,因为我不是凤凰城的专家,但上面“sehe”评论中的链接提供了答案。另外,你用
cref
,从
add()中没有任何指示
声明引用是必需的。
val
是将
some
变量转换为参数所需的

最后,您只需要提供一些合理的测试数据


上面的代码现在应该适合您了。

可能是@sehe的重复。答案中的bind表达式没有我的那么可怕:p.你真的想让某个[]成为一个数组吗?在我看来,它不会被编译。我很快就从const char[]到std::string,看看这是否对boost更有效。我只是不够小心
rule<std::string::iterator, double()>
[ boost::phoenix::bind(floatDecs.add, boost::phoenix::val(some), _1) ];