【发布时间】:2018-04-29 09:47:26
【问题描述】:
我正在学习 Boost Spirit 2,但我不明白为什么我不能将两个整数的序列解析为 int 的 STL 向量。从 >> 运算符 (here) 的文档中,我知道语法 int_ >> int_ 的属性应该是 vector<int>。从attribute notation documentation 我知道“vector<A> 的表示法代表任何 STL 容器 包含类型 A 的元素”。
然而,当我尝试向int_ >> int_ 添加一个以std::vector 作为其属性的操作时,编译失败。
在其他错误消息中,它显示:/usr/include/boost/bind/mem_fn_template.hpp:163:7: note: no known conversion for argument 2 from ‘boost::fusion::vector<int, int>’ to ‘const std::vector<int>&’
我知道this question(“让 boost::spirit::qi 使用 stl 容器”),但那里的解决方案 - 包括 std_tuple.hpp - 并没有改变任何东西。
这是为什么?
#include <iostream>
#include <string>
#include <vector>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/bind.hpp>
namespace client
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
class ParserActions
{
public:
void printivec (std::vector<int> const& ivec)
{
std::cout << "We see " << ivec.size() << " integers" << std::endl;
}
};
template <typename Iterator>
bool parse_ivec(Iterator first, Iterator last)
{
using ascii::space;
ParserActions actionContainer;
auto two_ints = (qi::int_ >> qi::int_);
bool r = qi::parse(
first, /*< start iterator >*/
last, /*< end iterator >*/
two_ints[boost::bind(&ParserActions::printivec,&actionContainer,_1)]
);
return first == last && r;
}
}
int main()
{
std::string str = "12 13";
if (client::parse_ivec(str.begin(),str.end()))
std::cout << "Parsing succeeded\n";
else
std::cout << "Parsing failed!\n";
return 0;
}
【问题讨论】:
标签: c++ parsing boost stdvector boost-spirit