2010-12-10 6 views
1

J'ai lu l'autre discussion sur copy or reference semantics for boost::spirt::qi::rule. J'utilise Boost 1.42.Stocker un boost :: spirit :: qi :: rule dans une liste std :: list

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

Cela échoue avec ...

Assertion `phrase_parse(iter, s.end(), ruleList.back(), traits::space())' failed. 
Aborted (core dumped) 

Y at-il un moyen de stocker des règles dans une liste STL ou deque? (Les références ne meurent pas avant d'être supprimées).

Répondre

2

Avec Boost v1.45, ce (essentiellement votre code ci-dessus) fonctionne sans problèmes (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; 
} 

Par conséquent, je suppose que c'est un bug dans la version de l'Esprit vous J'utilise.

0

Je n'ai pas pu obtenir votre exemple à compiler. En dehors de using les types corrects de ...::qi, vous avez ajouté un () au type trait::space.

Cela fonctionne w/o problème pour moi (booster 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
~>

s'il vous plaît noter que je l'utilise et qi::space_type`qi::space au lieu de l'espace de noms ascii. Je n'ai aucune idée de quoi/où l'espace de noms trait est.

Questions connexes