在 std::list 中存储 boost::spirit::qi::rule
我已阅读关于 boost::spirt:: 的复制或引用语义的其他线程qi::规则。我正在使用Boost 1.42。
using boost::spirit::qi::phrase_parse;
typedef boost::spirit::qi::rule < std::string::const_iterator, boost::spirit::ascii::space_type > rule_type;
std::list < rule_type > ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
std::cout << typeid(char_).name() << std::endl;
ruleList.push_back(char_);
ruleList.push_back(*ruleList.back());
assert(phrase_parse(iter, s.end(), ruleList.back(), boost::spirit::ascii::space));
assert(iter == s.end());
这会失败...
Assertion `phrase_parse(iter, s.end(), ruleList.back(), traits::space())' failed.
Aborted (core dumped)
有没有办法将规则存储在 STL 列表或双端队列中? (引用在删除之前不会消失)。
I have read the other thread about copy or reference semantics for boost::spirt::qi::rule. I am using Boost 1.42.
using boost::spirit::qi::phrase_parse;
typedef boost::spirit::qi::rule < std::string::const_iterator, boost::spirit::ascii::space_type > rule_type;
std::list < rule_type > ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
std::cout << typeid(char_).name() << std::endl;
ruleList.push_back(char_);
ruleList.push_back(*ruleList.back());
assert(phrase_parse(iter, s.end(), ruleList.back(), boost::spirit::ascii::space));
assert(iter == s.end());
This fails with...
Assertion `phrase_parse(iter, s.end(), ruleList.back(), traits::space())' failed.
Aborted (core dumped)
Is there a way to store rules in a STL list or deque? (References don't die until removed).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 Boost V1.45,这(本质上是上面的代码)可以正常工作(MSVC2010,g++ 4.5.1):
因此,我认为这是您正在使用的 Spirit 版本中的错误。
With Boost V1.45, this (essentially your code from above) works without problems (MSVC2010, g++ 4.5.1):
Therefore, I assume it's a bug in the version of Spirit you're using.
我无法编译你的示例。除了没有
使用
来自...::qi
的正确类型之外,您还向trait::space添加了一个
类型。()
这对我来说没有问题(boost 1.44)
~>g++ test.cpp && ./a.out
~>
请注意,我使用
qi::space_type
和`qi::space
而不是ascii
命名空间。我不知道trait
命名空间是什么/在哪里。I could not get your example to compile. Aside from not
using
the correct types from...::qi
, you added a()
to thetrait::space
type.This works w/o problem for me (boost 1.44)
~>g++ test.cpp && ./a.out
~>
please note I use
qi::space_type
and`qi::space
instead of theascii
namespace. I have no idea what/where thetrait
namespace is.