Cadeia de análise de erro de compilation RapidXML

Eu tenho tido problemas para usar o RapidXML para analisar uma string. Eu recebo um erro de dentro do Eclipse, alegando que a function de análise não existe.

make all Building file: ../search.cpp Invoking: Cross G++ Compiler g++ -DDEBUG -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"search.d" -MT"search.d" -o "search.o" "../search.cpp" ../search.cpp: In function 'void search(CURL*, CURLcode, std::string, std::string)': ../search.cpp:29:27: error: no matching function for call to 'rapidxml::xml_document::parse(const char*)' ../search.cpp:29:27: note: candidate is: ../rapidxml-1.13/rapidxml.hpp:1381:14: note: template void rapidxml::xml_document::parse(Ch*) [with int Flags = Flags, Ch = char] make: *** [search.o] Error 1 

O código a seguir gera um erro:

 rapidxml::xml_document doc; // This has no errors doc.parse(data.c_str()); // This line raises the error (data is a string) 

Para referência, aqui está a documentação on-line: http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1parsing

RapidXML vem como quatro arquivos de header:

  1. rapidxml_iterators.hpp
  2. rapidxml_print.hpp <- contém erros, mas a compilação é bem sucedida com eles
  3. rapidxml_utils.hpp <- contém erros, mas a compilação é bem sucedida com eles
  4. rapidxml.hpp <- linkado pelo programa, contém a função parse

Como resolvo o erro no meu código? Preciso de algum modo resolver os erros do compilador nos headers de alguma forma?

O problema é que o char* retornado de chamar c_str() em um std::string é na verdade um const char* que não é bom para a function de análise (a análise realmente altera a string que ele analisa em rapidXML). Isso significa que precisamos copiar a string antes de analisá-la

  xml_document<> doc; string str; // String you want to parse char* cstr = new char[str.size() + 1]; // Create char buffer to store string copy strcpy (cstr, str.c_str()); // Copy string into char buffer doc.parse<0>(cstr); // Pass the non-const char* to parse() // Do stuff with parsing delete [] cstr; // free buffer memory when all is finished 

Eu não tentei compilar o acima, então talvez haja erros, o ponto é que c_str() retorna um const char* e parse() deve pegar um char* não const char* . Espero que isto ajude. Quanto aos seus headers, costumo sair usando apenas

  rapidxml.hpp rapidxml_print.hpp 

incluído nos meus arquivos de origem. Você não tem problemas de linker porque o RapidXML é apenas uma implementação de header (o que o torna agradável na minha opinião).