пространства имен — C ++ & quot; DOMDocument: переопределение & quot; Ошибка с Xercesc

Моя проблема в том, что Xerces и Windows оба имеют 'DOMDocument' объект. Xerces и почти все, что я читал Вот, Вот а также Вот предложил определить пространство имен или неопределить DOMDocument который должен выглядеть примерно так.

Void foo(XERCES_CPP_NAMESPACE::DOMDocument* pDocument);

или же

#undef DOMDocument
#include <xerces/Stuff>

Я хотел пойти по вменяемому пути и просто применить пространство имен, но это, похоже, не работает. Я действительно не решаюсь использовать #undef это похоже на хакинг вокруг проблемы.

Файл Windows msxml.h это тот, который жалуется на переопределение.

Может ли это быть связано с порядком их загрузки? У меня есть что-то вроде этого,

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <list>
#include <map>
#include <ctime>
#include "XMLClass.h"

куда XMLClass.h включает заголовки xerces. Трудно сказать, что является причиной проблемы, потому что ошибка появляется в заголовке Microsoft.

Я также искал 'DOMDocument' во всем проекте и везде я использую 'DOMDocument' имеет пространство имен XERCES_CPP_NAMESPACE,

Замечания: Я использую Xerces 3.1 и VS 2010.

Идеи?

Обновить:
я пытался #undef перед добавлением заголовков xerces, и я все еще получаю сообщение об ошибке. Так что я действительно в растерянности относительно того, почему оба решения не работают для меня.

Обновление 2:
Я также попытался изменить пространство имен с XERCES_CPP_NAMESPACE::DOMDocument в xercesc::DOMDocument но это не помогло.

2

Решение

Это была проблема порядка загрузки заголовков.

Есть 2 библиотеки, которые я знаю, которые включают msxml.h где-то внутри их кода,

#include<Windows.h>

а также

#include<ole2.h>

В моем случае #include <Windows.h> случилось вниз по течению моего #include "XMLClass.h", Таким образом, решение было определить msxml.h до xerces как это,

#include<msxml.h>             //defines DOMDocument first
//defines DOMDocument with a different namespace
#include <xercesc/dom/DOMDocument.hpp>

Так как xerces помнил о пространствах имен, а Microsoft — нет, если заголовки определены в обратном порядке, как это,

#include <xercesc/dom/DOMDocument.hpp>
#include<msxml.h>

независимо от того, что вы делаете, ваш код не будет компилироваться. Компилятор скажет вам, что вы переопределяете 'DOMDocument', что на самом деле происходит. Это из-за того, как Microsoft написала msxml.h,

Надеюсь, что это поможет любому столкнуться с этой проблемой.

Замечания:

вы должны ВСЕГДА включать пространство имен при определении объектов «DOMDocument», параметров и возвращаемых типов, как это,

XERCES_CPP_NAMESPACE::DOMDocument xmlDoc;

void setDoc(XERCES_CPP_NAMESPACE::DOMDocument xmlDoc);

XERCES_CPP_NAMESPACE::DOMDocument getDoc();

или вы будете продолжать получать ошибки двусмысленности или наихудший он примет неправильный тип данных во время выполнения.

4

Другие решения

Я также столкнулся с подобной проблемой, когда одно определение исходило из файла mshtml.h, а другое — из xercesc.
Было три класса, которые я использовал
«DOMDocumentType» «DOMException» «DOMProcessingInstruction»

и после изменения порядка все заработало

Спасибо

2

По вопросам рекламы [email protected]