Question

J'ai lu l'autre discussion sur copier ou la sémantique de référence pour boost :: spirt :: :: règle qi. J'utilise 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());

é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 jusqu'à leur suppression).

Était-ce utile?

La solution

Avec v1.45 Boost, 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 que vous utilisez.

Autres conseils

Je ne pouvais pas obtenir votre exemple pour compiler. En plus de ne pas using les bons types de ...::qi, vous avez ajouté un () au type de trait::space.

Cela fonctionne w / o problème pour moi (augmenter 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 ne sais pas ce que / où l'espace de noms est trait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top