Моя проблема в том, что 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 библиотеки, которые я знаю, которые включают 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»
и после изменения порядка все заработало
Спасибо