下面的代码是解析一个“键= VAL; ..”串入的std ::地图并将其失败,错误进行编译:
错误C2146:语法错误:缺少“>”之前识别符“VALUE_TYPE” 错误C2039: 'VALUE_TYPE':不是 '的std ::对,标准::分配器,性病:: basic_string的,性病::分配器>>' C的成员:\ GIT中\风险引擎core_tcp \阶段\助推1.66.0-巴克莱-1 \包括\提升\精神\家\ SUPPORT \ container.hpp
它不喜欢最后一个参数,“内容”(标准::地图),作为容器通过。
升压版本是1.66
namespace qi = boost::spirit::qi;
std::map<std::string,std::string> contents;
std::string::iterator first = str.begin();
std::string::iterator last = str.end();
const bool result = qi::phrase_parse(first,last,
*( *(qi::char_-"=") >> qi::lit("=") >> *(qi::char_-";") >> -qi::lit(";") ),
ascii::space, contents);
纵观提升文档和堆栈溢出,我没有看到上面的代码中的任何问题。
是否包含
#include <boost/fusion/adapted/std_pair.hpp>
下面是一些改进建议的工作示例:
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/include/qi.hpp>
#include <map>
#include <iomanip> // std::quoted
namespace qi = boost::spirit::qi;
int main() {
std::string str("key = value");
std::string::const_iterator first = str.begin();
std::string::const_iterator last = str.end();
std::map<std::string, std::string> contents;
bool const result = qi::phrase_parse(first,last,
*( *~qi::char_('=') >> '=' >> *~qi::char_(';') >> -qi::lit(';') ),
qi::ascii::space, contents);
if (result) {
std::cout << "Parsed " << contents.size() << " elements\n";
for (auto& [k,v] : contents) {
std::cout << "\t" << std::quoted(k) << ": " << std::quoted(v) << "\n";
}
} else {
std::cout << "Parse failed\n";
}
if (first != last)
std::cout << "Remaining input unparsed: " << std::quoted(std::string(first, last)) << "\n";
}
打印
Parsed 1 elements
"key": "value"