在std::列表中存储boost::spirit::qi::规则

在std::列表中存储boost::spirit::qi::规则,boost,boost-spirit-qi,Boost,Boost Spirit 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")

我已经读了另一篇文章。我使用的是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());

有没有办法在STL列表或deque中存储规则?(引用在删除之前不会消失)。

我无法编译您的示例。除了不使用
中的正确类型之外,您还向
trait::space
类型添加了
()

这对我来说是可行的,没有问题(boost 1.44)

#包括
#包括
#包括
#包括
使用boost::spirit::qi::短语解析;
typedef boost::spirit::qi::rulerule\u type;
int main(){
标准::列表<规则类型>规则列表;
std::字符串常量s(“abcdef”);
std::string::const_迭代器iter=s.begin(),end=s.end();
规则列表。推回(*boost::spirit::qi::char);
断言(短语解析(iter,s.end(),ruleList.back(),boost::spirit::qi::space));
断言(iter==s.end());
}
~>g++test.cpp&&./a.out
~>

请注意,我使用了
qi::space\u type
`qi::space
而不是
ascii
名称空间。我不知道trait
名称空间是什么/在哪里。

对于Boost V1.45,这(基本上是上面的代码)可以正常工作(MSVC2010,g++4.5.1):

#包括
#包括
#包括
#包括
使用名称空间boost::spirit;
int main()
{
typedef qi::规则规则类型;
std::列表规则列表;
std::字符串常量s(“abcdef”);
std::string::const_迭代器iter=s.begin(),end=s.end();
标准::cout
Assertion `phrase_parse(iter, s.end(), ruleList.back(), traits::space())' failed.
Aborted (core dumped)
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <vector>
#include <cassert>

using boost::spirit::qi::phrase_parse;

typedef boost::spirit::qi::rule < std::string::const_iterator, boost::spirit::qi::space_type > rule_type;

int main() {

std::list < rule_type > ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
ruleList.push_back(*boost::spirit::qi::char_);
assert(phrase_parse(iter, s.end(), ruleList.back(), boost::spirit::qi::space));
assert(iter == s.end());

}
#include <list>
#include <string>
#include <iostream>
#include <boost/spirit/include/qi.hpp>

using namespace boost::spirit; 

int main()
{
    typedef qi::rule<std::string::const_iterator, 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(qi::char_).name() << std::endl; 

    ruleList.push_back(qi::char_); 
    ruleList.push_back(*ruleList.back()); 

    assert(qi::phrase_parse(iter, s.end(), ruleList.back(), ascii::space)); 
    assert(iter == s.end());

    return 0;
}