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>
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
@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
@chac Sí, es una pena que la página se mantenga en la comunidad, o yo personalmente edite el #include allí. – sehe