Rapid XML: невозможно распечатать - ошибка компиляции - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь распечатать данные документа XML в консоли, используя библиотеку Rapid XML в моем приложении C ++.

Я перехожу по ссылке Rapid XML Manual здесь , но я получил ошибку во время компиляции.

Вот мой код 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)
                      ^~~~~~~~~~~~~~

Obs .: Я уже попробовал два других метода печати Rapid XML, описанных в руководстве (ссылка выше).

Моя настройка:

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

1 Ответ

2 голосов
/ 25 февраля 2020

Я сталкивался с той же проблемой в прошлом. Обходной путь, представленный в этом SO-ответе , прекрасно работает для всех моих сборок G CC с тех пор.

Подводя итог информации другого ответа: он сводится к имени искать изменения, сделанные в G CC 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"
...