Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RapidXML print header has undefined methods

Tags:

I've been messing with using RapidXML on one of my projects. It was all going so well until I decided to use it for writing out xml. My code is more or less as follows:

//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(); 

At compile time I get the following errors:

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 

What doesn't make sense to me is why it is breaking in this way. Looking through the rapidxml_print.hpp header I see all of the above noted functions referenced inside a print_node function. Later the print_children, print_element_node, etc functions are defined and it looks ok at a glance. What am I doing wrong here?

like image 346
Los Frijoles Avatar asked Jan 01 '13 20:01

Los Frijoles


2 Answers

For those who come here looking for a solution to the same problem, I have a solution. After looking at http://gcc.gnu.org/gcc-4.7/porting_to.html under "Name lookup changes" (per n.m.'s suggestion) I changed the rapidxml_print.hpp header to have the following right before the declaration of the print_node function (in my file, I inserted this right after line 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); 

It now compiles nicely using GCC with a single warning since apparently int flags is unused in the print_attributes function.

like image 102
Los Frijoles Avatar answered Sep 20 '22 17:09

Los Frijoles


If you need to use gcc version greater than or equal to 4.7 and you are cloning the rapidxml repository during your build.

Replace:

#include "rapidxml.hpp" #include "rapidxml_print.hpp" 

With this:

#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_ */ 
like image 39
Angel Lee Avatar answered Sep 21 '22 17:09

Angel Lee