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

标签 c++ xml printf cout rapidxml

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

我正在遵循 RapidXML 手册 link here ,但我遇到了编译时错误。

这是我的 C++ 代码:

#include <iostream>
#include "rapidxml.hpp"
#include "rapidxml_utils.hpp"
#include "rapidxml_print.hpp"

int main() {
    rapidxml::file<> xmlFile("beerJournal.xml");
    rapidxml::xml_document<> doc;
    doc.parse<0>(xmlFile.data());

    std::cout << doc;

    return 0;
}

错误如下:

rapidxml_print.hpp:115: error: ‘print_children’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
                 out = print_children(out, node, flags, indent);
                       ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~

rapidxml_print.hpp:169: ‘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
         inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent)
                      ^~~~~~~~~~~~~~

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

我的设置:

  • Ubuntu 19 x64
  • G++ 8.3.0
  • RapidXML 1.13
  • Qt Creator IDE 4.11.0
  • Qt 5.14.0

最佳答案

我过去也遇到过同样的问题。 this SO answer 中介绍的解决方法从那时起,我的所有 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 https://stackoverflow.com/a/55408678
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"

关于c++ - RapidXML:无法打印 - 编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60383777/

相关文章:

c - C 中的 printf 和 %s

string-formatting - sprintf 相当于 xtend

c++ - Linker cannot find qwebp lib - 静态Qt5.3.2编译

c++ - 为什么我的代码不能与旧的访问驱动程序一起使用?

c++ - Websphere MQ C++ 多线程

.net - 是否存在类似于System.IO.Path.Combine()的XPath串联操作?

xml - 将 XML 标签存储到 shell 中的 Perl 变量

c++ - 扁平化为 1D 数组的 2D 和 3D 数组的等效迭代?

xml - 如何使用 XSLT 从 XML 中删除特定元素

java - Java 中 printf/format 的变量/参数化宽度(使用 * 或其他东西?)