Je suis un débutant Boost.Qi, alors j'essaie quelques exemples simples pour essayer de me faire une idée. Je suis en train d'analyser une chaîne qui ressemble à:Boost.Qi erreur du compilateur avec l'analyseur en option
A:1 B:2 C:3
Il y a un nombre quelconque d'espaces entre chaque composant dans la chaîne. Les portions A:
, etc. sont corrigées et je voudrais analyser les valeurs entières. Le troisième composant de la chaîne, C:3
dans l'exemple ci-dessus, est facultatif. Je suis venu avec l'exemple simple suivant pour tester Boost.Qi pour cette application:
#include <boost/optional.hpp>
#include <boost/spirit/include/qi.hpp>
#include <iostream>
namespace qi = boost::spirit::qi;
int main()
{
std::string s = "A:1 B:2 C:3";
int a, b;
boost::optional<int> c;
if (!qi::parse(s.begin(), s.end(),
qi::lit("A:") >> qi::int_ >> +qi::space >> "B:" >> qi::int_ >>
-(+qi::space >> "C:" >> qi::int_), a, b, c))
{
std::cout << "failed to parse" << std::endl;
}
std::cout << a << ' ' << b << ' ' << c.value_or(-1) << std::endl;
}
Toutefois, cela ne peut pas compiler (en utilisant Boost v1.58 et g ++ 5.4.0 en mode 11 C de). Dans la mer typique des messages d'erreur de modèle de C, je trouve les suivantes:
spirit.cc:15:55: required from here
/usr/include/boost/spirit/home/support/container.hpp:130:12: error: ‘int’ is not a class, struct, or union type
struct container_value
et
spirit.cc:15:55: required from here
/usr/include/boost/spirit/home/qi/detail/pass_container.hpp:316:66: error: no type named ‘type’ in ‘struct boost::spirit::traits::container_value<int, void>’
typedef typename traits::container_value<Attr>::type value_type;
^
/usr/include/boost/spirit/home/qi/detail/pass_container.hpp:329:15: error: no type named ‘type’ in ‘struct boost::spirit::traits::container_value<int, void>’
Est-il évident à tout le monde ce que je fais mal ici?
Je pense que vous devez explicitement [Omettre] (http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc /html/spirit/qi/reference/directive/omit.html) les deux occurrences de '+ qi :: space', puisque son attribut ne vous intéresse pas. –