2012-02-20 14 views
5

La risposta accettata a this altra domanda mi porta a campione this, ma la compilazione fornisce un lungo elenco di errori. Ecco il codice di esempio, ho aggiunto solo la comprende e un manichino main():errore di compilazione campione Spirit

#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 
} 

Ho provato sia dare impulso 1.42 (default sul mio Ubuntu 11.04 distro), e 1,48 (scaricato). Errori (I segnalano quelli filtrata da QtCreator) si differenziano: ver 1.42 dà

/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_&)’ 

mentre ver. 1.48 dà

/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>&)’ 

Ho qualcosa che manca?

Edit: ho trovato la soluzione: aggiungere questa intestazione e entrambe le versioni compilare

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

risposta

5

Congratulazioni per il monitoraggio questo giù ... Mi ha colpito lo stesso errore un paio di settimane fa e ore sprecate con esso. Come hai trovato, la soluzione è solo quello di includere questo:

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

che fornisce la magia necessaria per Qi usare std :: coppia come l'uscita di una regola.

Sto principalmente lasciando questa risposta qui solo per cui la domanda non si presenta più come senza risposta - se vuoi aggiungere/accettare la tua risposta ritirerò questo.

+0

sì che è una faq grave, anche se in giustizia è [un commento di Thomas Heller] (http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key -valore-coppie-usando-spirito-qi/commento-pagina-1/# commento-160) su quell'articolo :) – sehe

+0

@sehe: ho trovato quella piccola riga dopo pagine e pagine di lettura pesante e molti tentativi (in parte riusciti, ma generalmente frustrante) di creare il mio piccolo test case. Non posso credere che ** include ** potrebbe risolvere il mio problema. Quello che mi fa male, è che i documenti nascondono la semplicità chiaramente illustrata da Hartmut Kaiser ... – CapelliC

+0

@chac Sì, è un peccato che la pagina sia gestita dalla comunità, o personalmente modificherò il #include. – sehe