c++ - El encabezado de impresión RapidXML tiene métodos indefinidos
undefined-reference (3)
Para aquellos que vienen aquí buscando una solución al mismo problema, tengo una solución. Después de consultar http://gcc.gnu.org/gcc-4.7/porting_to.html en "Cambios en la búsqueda de nombres" (sugerencia de nm) cambié el encabezado rapidxml_print.hpp para tener el siguiente derecho antes de la declaración de la función print_node (En mi archivo, inserté esto justo después de la línea 104):
template<class OutIt, class Ch>
inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch>
inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int flags);
template<class OutIt, class Ch>
inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch>
inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch>
inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch>
inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch>
inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch>
inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch>
inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
Ahora compila bien usando GCC con una sola advertencia, ya que aparentemente los int flags
no se utilizan en la función print_attributes.
He estado jugando con el uso de RapidXML en uno de mis proyectos. Todo iba muy bien hasta que decidí usarlo para escribir xml. Mi código es más o menos como sigue:
//attempt to open the file for writing
std::ofstream file(fileName.c_str());
if (!file.is_open())
return false; //the file didn''t open
xml_document<> doc;
//creates the contents of the document...
//...
//...
//write the document out to the file
file << doc; //if I remove this line it compiles...but I kinda need this line to output to the file
file.close();
En el momento de la compilación recibo los siguientes errores:
In file included from ../Engine/xmlfileloader.cpp:12:0:
../Engine/include/rapidxml_print.hpp: In instantiation of ''OutIt rapidxml::internal::print_node(OutIt, const rapidxml::xml_node<Ch>*, int, int) [with OutIt = std::ostream_iterator<char, char, std::char_traits<char> >; Ch = char]'':
../Engine/include/rapidxml_print.hpp:390:57: required from ''OutIt rapidxml::print(OutIt, const rapidxml::xml_node<Ch>&, int) [with OutIt = std::ostream_iterator<char, char, std::char_traits<char> >; Ch = char]''
../Engine/include/rapidxml_print.hpp:403:9: required from ''std::basic_ostream<Ch>& rapidxml::print(std::basic_ostream<Ch>&, const rapidxml::xml_node<Ch>&, int) [with Ch = char]''
../Engine/include/rapidxml_print.hpp:414:31: required from ''std::basic_ostream<Ch>& rapidxml::operator<<(std::basic_ostream<Ch>&, const rapidxml::xml_node<Ch>&) [with Ch = char]''
../Engine/xmlfileloader.cpp:400:13: required from here
../Engine/include/rapidxml_print.hpp:115:17: error: ''print_children'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:169:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_children(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
../Engine/include/rapidxml_print.hpp:120:17: error: ''print_element_node'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:242:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_element_node(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
../Engine/include/rapidxml_print.hpp:125:17: error: ''print_data_node'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:208:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_data_node(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
../Engine/include/rapidxml_print.hpp:130:17: error: ''print_cdata_node'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:219:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_cdata_node(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
../Engine/include/rapidxml_print.hpp:135:17: error: ''print_declaration_node'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:298:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_declaration_node(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
../Engine/include/rapidxml_print.hpp:140:17: error: ''print_comment_node'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:321:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_comment_node(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
../Engine/include/rapidxml_print.hpp:145:17: error: ''print_doctype_node'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:339:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_doctype_node(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
../Engine/include/rapidxml_print.hpp:150:17: error: ''print_pi_node'' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
../Engine/include/rapidxml_print.hpp:361:22: note: ''template<class OutIt, class Ch> OutIt rapidxml::internal::print_pi_node(OutIt, const rapidxml::xml_node<Ch>*, int, int)'' declared here, later in the translation unit
Lo que no tiene sentido para mí es por qué se está rompiendo de esta manera. Mirando a través del encabezado de rapidxml_print.hpp
, veo todas las funciones mencionadas anteriormente referenciadas dentro de una función print_node. Más tarde, las funciones print_children, print_element_node, etc se definen y se ven bien de un vistazo. ¿Qué estoy haciendo mal aquí?
Si necesitas usar una versión de gcc mayor o igual a 4.7 y estás clonando el repositorio de rapidxml durante tu compilación.
Reemplazar:
#include "rapidxml.hpp"
#include "rapidxml_print.hpp"
Con este:
#include "rapidxml_ext.h"
rapidxml_ext.h:
#ifndef RAPIDXML_EXT_H_
#define RAPIDXML_EXT_H_
#include "rapidxml.hpp"
/* Adding declarations to make it compatible with gcc 4.7 and greater */
namespace rapidxml {
namespace internal {
template <class OutIt, class Ch>
inline OutIt print_children(OutIt out, const xml_node<Ch>* node, int flags, int indent);
template <class OutIt, class Ch>
inline OutIt print_attributes(OutIt out, const xml_node<Ch>* node, int flags);
template <class OutIt, class Ch>
inline OutIt print_data_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
template <class OutIt, class Ch>
inline OutIt print_cdata_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
template <class OutIt, class Ch>
inline OutIt print_element_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
template <class OutIt, class Ch>
inline OutIt print_declaration_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
template <class OutIt, class Ch>
inline OutIt print_comment_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
template <class OutIt, class Ch>
inline OutIt print_doctype_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
template <class OutIt, class Ch>
inline OutIt print_pi_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
}
}
#include "rapidxml_print.hpp"
#endif /* RAPIDXML_EXT_H_ */
Y para eliminar las banderas no utilizadas en la función print_attributes, elimine la palabra flags en el prototipo de esa función
template<class OutIt, class Ch>
inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int);
y en su declaracion
template<class OutIt, class Ch>
inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int)
{