RapidXML:无法打印 - 编译时错误

Nyc*_*aia 2 c++ xml printf rapidxml cout

我正在尝试使用 C++ 应用程序中的 RapidXML 库在控制台中打印 XML 文档数据。

\n\n

我正在关注此处的 RapidXML 手册链接,但出现编译时错误。

\n\n

这是我的 C++ 代码:

\n\n
#include <iostream>\n#include "rapidxml.hpp"\n#include "rapidxml_utils.hpp"\n#include "rapidxml_print.hpp"\n\nint main() {\n    rapidxml::file<> xmlFile("beerJournal.xml");\n    rapidxml::xml_document<> doc;\n    doc.parse<0>(xmlFile.data());\n\n    std::cout << doc;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是错误:

\n\n
rapidxml_print.hpp:115: error: \xe2\x80\x98print_children\xe2\x80\x99 was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]\n                 out = print_children(out, node, flags, indent);\n                       ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~\n\nrapidxml_print.hpp:169: \xe2\x80\x98template<class OutIt, class Ch> OutIt rapidxml::internal::print_children(OutIt, const rapidxml::xml_node<Ch>*, int, int)\xe2\x80\x99 declared here, later in the translation unit\n         inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent)\n                      ^~~~~~~~~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n\n

观察:我已经尝试了手册中描述的其他两种 RapidXML 打印方法(上面的链接)。

\n\n

我的设置:

\n\n
    \n
  • 乌班图 19 x64
  • \n
  • G++8.3.0
  • \n
  • RapidXML 1.13
  • \n
  • Qt 创建者集成开发环境 4.11.0
  • \n
  • Qt 5.14.0
  • \n
\n

Joe*_*ann 5

我过去也遇到过同样的问题。从那时起,这个 SO 答案中提出的解决方法对于我所有的 GCC 构建都非常有效。

总结其他答案的信息:它归结为 GCC 4.7 中进行的名称查找更改。解决方法包括创建一个rapidxml_ext.hpp以以下内容命名的文件。然后包含rapidxml_ext.hpp在您的客户端应用程序/库中。

rapidxml_ext.hpp

#pragma once

#include "rapidxml.hpp"

// Adding declarations to make it compatible with gcc 4.7 and greater
// See /sf/answers/3878607491/
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"
Run Code Online (Sandbox Code Playgroud)