2010-12-10 59 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命名空間。我不知道名稱空間是什麼/在哪裏。

相關問題