C++"' DOMDocument': переопределение " ошибка с Xercesc
Моя проблема в том, что Xerces и Windows имеют объект 'DOMDocument'. Ксеркс и почти все, что я читал здесь, вот и вот предложил определить пространство имен или undefine 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();Или вы будете продолжать получать ошибки неоднозначности или худшее это будет предполагать неправильный тип данных во время выполнения.
Я также столкнулся с подобной проблемой, когда одно определение пришло из mshtml.файл h И еще один из xercesc. Было три класса, которые я использовал "DOMDocumentType" "DOMException" "DOMProcessingInstruction"
И после изменения порядка это сработало
Спасибо
Comments