2010-12-10 64 views
1

我已阅读关于copy or reference semantics for boost::spirt::qi::rule的其他线程。我正在使用Boost 1.42。在std :: list中存储boost :: spirit :: qi :: rule

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列表或双端队列规则的方法吗? (引用不会死亡,直到删除)。

回答

2

有增强V1.45,这(基本上是你从上面的代码)的作品没有问题(MSVC2010,G ++ 4.5.1):

#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; 
} 

因此,我以为这是在精神,你的版本中的错误正在使用。

0

我无法让你的例子编译。除了从using正确的类型...::qi,您添加()trait::space类型。

这个工程W/O对我的问题(提高1.44)

#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()); 

} 

~>g++ test.cpp && ./a.out
~>

请注意我用qi::space_type`qi::space代替ascii命名空间。我不知道名称空间是什么/在哪里。

相关问题