提升精神:错误 C2664,无法将"const boost::p hoenix::actor"<Eval>转换为"char"
Boost Spirit: Error C2664, Cannot convert 'const boost::phoenix::actor<Eval>' to 'char'
我是Boost Spirit的新手,正在尝试使用Boost Spirity 2.4.2(Boost 1.46.1(编写JSON解析器。对于下面的代码,我在尝试执行语义操作/属性时出错:
Error 1 error C2664: 'void (char)' : cannot convert parameter 1 from 'const boost::phoenix::actor<Eval>' to 'char'
我看到了一些问题,但它们并不真正适用于我的情况。请帮忙。非常感谢。
#include <map>
#include <string>
#include <vector>
#include <iostream>
#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_stl.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/phoenix_container.hpp>
#include <boost/spirit/include/phoenix_function.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/fusion/include/adapt_assoc_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;
void print_char(char c)
{
std::cout << c;
}
template <typename Iterator>
struct json_grammar : qi::grammar<Iterator, ascii::space_type>
{
json_grammar() : json_grammar::base_type(start)
{
using ascii::alpha;
using ascii::alnum;
using qi::long_long;
using qi::long_double;
using qi::lit;
using qi::char_;
using qi::lexeme;
typedef boost::function<void(char)> char_action_t;
//char_action_t beginObj (boost::bind(&print_char, qi::_1));
//
start =
char_('{') [boost::bind(&print_char, qi::_1)]
>> -(js_member % ',')
>> char_('}')
;
//
js_member =
js_key
>> ':' >> js_value
;
//
js_key = (alpha >> *alnum) | js_string
;
//
js_string = js_single_quoted_str | js_double_quoted_str
;
//
js_array = lit('[') >> -(js_value % ',') >> lit(']')
;
//
js_bool = lit("true") | lit("false")
;
//
js_null = lit("null")
;
//
js_value = js_string | js_num | js_array | start | js_bool | js_null | js_empty_str;
//
js_single_quoted_str = (lexeme["'" >> +((char_ | ' ' | "t") - "'") >> "'"]);
//
js_double_quoted_str = (lexeme['"' >> +((char_ | ' ' | "t") - '"') >> '"']);
//
js_empty_str = lit("''") | lit("""");
//
js_num = long_long | long_double;
}
qi::rule<Iterator, ascii::space_type> start;
qi::rule<Iterator, ascii::space_type> js_member;
qi::rule<Iterator, ascii::space_type> js_key;
qi::rule<Iterator, ascii::space_type> js_value;
qi::rule<Iterator, ascii::space_type> js_string;
qi::rule<Iterator, ascii::space_type> js_single_quoted_str;
qi::rule<Iterator, ascii::space_type> js_double_quoted_str;
qi::rule<Iterator, ascii::space_type> js_empty_str;
qi::rule<Iterator, ascii::space_type> js_array;
qi::rule<Iterator, ascii::space_type> js_num;
qi::rule<Iterator, ascii::space_type> js_null;
qi::rule<Iterator, ascii::space_type> js_bool;
};
int main()
{
std::string inputStr;
json_grammar<std::string::const_iterator> jsonParser;
bool parseOK = false;
while(std::getline(std::cin, inputStr)) {
if(inputStr.empty() || inputStr[0] == 'q' || inputStr[0] == 'Q')
break;
std::string::const_iterator iter = inputStr.begin();
std::string::const_iterator iterEnd = inputStr.end();
parseOK = qi::phrase_parse(iter, iterEnd, jsonParser, ascii::space);
if(parseOK && iter == iterEnd) {
std::cout << "Successfully parsed the input as JSON!" << std::endl;
} else {
std::cout << "Cannot parse the input as JSON!" << std::endl;
}
}
return 0;
}
更多更新:
Kostya有一个很好的点,"半"触底:boost::bind
实际上很好,只是使用不同的占位符:
[ boost::bind(&print_char, ::_1) ]
[ phoenix::bind(&print_char, qi::_1) ]
[ print_char ]
这三种方法都应该有效,但不能混用:(
似乎boost::bind
不太适合与精灵一起使用。我记得建议使用phoenix
。我已将考虑中的行替换为:
char_('{') [std::cout << boost::phoenix::arg_names::arg1]
它编译。没有时间检查它是否真的有效。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- UE4在OnComponentBeginOverlap上铸造其他actor
- 在生成Actor(虚幻引擎4)时出现错误
- 如何显式调用运算符<<
- 如何编译和运行一个新的 C++ Actor 框架项目?
- 无法使用 LoadObject() 函数编译 UE4 Actor。
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 来自Actor Call的返回价值
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 虚幻引擎Actor类的OnConstruction()方法未正确执行