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, но это не помогло.

599   2  

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

    Ничего не найдено.