【问题标题】:Storing a boost::spirit::qi::rule in a std::list在 std::list 中存储 boost::spirit::qi::rule
【发布时间】:2010-12-10 01:36:30
【问题描述】:

我已经阅读了关于copy or reference semantics for boost::spirt::qi::rule 的其他帖子。我正在使用 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 列表或双端队列中? (引用在被删除之前不会消失)。

【问题讨论】:

    标签: boost boost-spirit-qi


    【解决方案1】:

    使用 Boost 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;
    }
    

    因此,我认为这是您使用的 Spirit 版本中的错误。

    【讨论】:

      【解决方案2】:

      我无法编译您的示例。除了using 不是来自...::qi 的正确类型之外,您还向trait::space 类型添加了()

      这对我来说没有问题(提升 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 命名空间。我不知道trait 命名空间是什么/在哪里。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多