2012-02-20 25 views
5

La respuesta aceptada a this otra pregunta me llevó a this muestra, pero al compilarla aparece una larga lista de errores. Aquí el código de ejemplo, he añadido sólo la incluye y una principal ficticia():error al compilar muestra de espíritu

#include <boost/spirit/include/qi.hpp> 
#include <vector> 
#include <map> 
#include <string> 
#include <iostream> 

namespace qi = boost::spirit::qi; 

template <typename Iterator> 
struct keys_and_values 
    : qi::grammar<Iterator, std::map<std::string, std::string>()> 
{ 
    keys_and_values() 
     : keys_and_values::base_type(query) 
    { 
     query = pair >> *((qi::lit(';') | '&') >> pair); 
     pair = key >> -('=' >> value); 
     key = qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9"); 
     value = +qi::char_("a-zA-Z_0-9"); 
    } 
    qi::rule<Iterator, std::map<std::string, std::string>()> query; 
    qi::rule<Iterator, std::pair<std::string, std::string>()> pair; 
    qi::rule<Iterator, std::string()> key, value; 
}; 

int main(int argc, char **argv) 
{ 
    std::string input("key1=value1;key2;key3=value3"); // input to parse 
    std::string::iterator begin = input.begin(); 
    std::string::iterator end = input.end(); 

    keys_and_values<std::string::iterator> p; // create instance of parser 
    std::map<std::string, std::string> m;  // map to receive results 
    bool result = qi::parse(begin, end, p, m); // returns true if successful 
} 

He intentado tanto impulsar 1.42 (por defecto en mi distro Ubuntu 11.04), y 1,48 (descargado). Los errores (informo aquellos filtrados por QtCreator) difieren: ver 1.42 da

/usr/include/boost/fusion/support/tag_of.hpp:92:13: error: no matching function for call to ‘assertion_failed(mpl_::failed************ boost::mpl::not_<boost::fusion::detail::is_specialized<std::pair<std::basic_string<char>, std::basic_string<char> > > >::************)’ 

/usr/include/boost/spirit/home/support/attributes.hpp:409: error: no matching function for call to ‘std::basic_string<char>::basic_string(std::pair<std::basic_string<char>, std::basic_string<char> >&)’ 

/usr/include/boost/spirit/home/support/attributes.hpp:409: error: no matching function for call to ‘std::basic_string<char>::basic_string(mpl_::void_&)’ 

while ver. 1.48 da

/home/carlo/Projects/spirit_vect_literals-build-desktop/../../cpp/boost_1_48_0/boost/spirit/home/qi/detail/assign_to.hpp:123: error: no matching function for call to ‘std::pair<std::basic_string<char>, std::basic_string<char> >::pair(const std::basic_string<char>&)’ 

¿No tengo algo que falta?

edición: he encontrado la solución: añadir esta cabecera y ambas versiones compilar

#include <boost/fusion/adapted/std_pair.hpp> 

Respuesta

5

Felicidades en el seguimiento de esto abajo ... Me golpeó el mismo error hace unas semanas y horas perdidas con eso. Como lo encontró, la solución está a incluir este:

#include <boost/fusion/adapted/std_pair.hpp> 

que proporciona la magia necesaria para Qi utilizar std :: pair como la salida de una regla.

Principalmente dejo esta respuesta aquí solo para que la pregunta ya no aparezca como sin respuesta: si quiere agregar/aceptar su propia respuesta, me retractaré de esto.

+0

yup que es un faq serio, aunque para ser justos es [un comentario de Thomas Heller] (http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key -value-pairs-using-spirit-qi/comment-page-1/# comment-160) en ese artículo :) – sehe

+0

@sehe: encontré esa pequeña línea después de páginas y páginas de gran lectura y muchos intentos (parcialmente exitosa, pero generalmente frustrante) de crear mi caso de prueba extra pequeño. No puedo creer que ** incluir ** podría resolver mi problema. Lo que me duele, es que los documentos ocultan la simplicidad claramente ilustrada por Hartmut Kaiser ... – CapelliC

+0

@chac Sí, es una pena que la página se mantenga en la comunidad, o yo personalmente edite el #include allí. – sehe

Cuestiones relacionadas