我的问题是Xerces和Windows都具有'DOMDocument'
对象。 Xerces和几乎所有我读过的here,here和here都建议定义 namespace 或取消定义DOMDocument
,其外观应类似于此。
Void foo(XERCES_CPP_NAMESPACE::DOMDocument* pDocument);
要么
#undef DOMDocument
#include <xerces/Stuff>
我想走明智的路线,只应用 namespace ,但它似乎不起作用。我真的很犹豫使用
#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 header 。很难说出是什么原因引起的,因为该错误显示在Microsoft header 中。我还在整个项目中搜索了
'DOMDocument'
,在我使用'DOMDocument'
的任何地方都有一个XERCES_CPP_NAMESPACE
命名空间。注意:我正在使用xerces 3.1和VS 2010。
有想法吗?
更新:
在添加xerces header 之前,我尝试过
#undef
,但仍然收到错误。因此,对于两种解决方案都不适合我的原因,我确实感到茫然。更新2:
我还尝试将 namespace 从
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
留意 namespace ,而Microsoft则不留意,因此,如果 header 以这种相反的顺序定义,#include <xercesc/dom/DOMDocument.hpp>
#include<msxml.h>
无论您做什么,代码都不会编译。编译器会告诉您您正在重新定义
'DOMDocument'
,这实际上是正在发生的事情。这是因为Microsoft编写msxml.h
的方式。希望这可以帮助任何碰到这个问题的人。
注意:
在定义“DOMDocument”对象,参数和返回类型时,您必须始终包含 namespace ,
XERCES_CPP_NAMESPACE::DOMDocument xmlDoc;
void setDoc(XERCES_CPP_NAMESPACE::DOMDocument xmlDoc);
XERCES_CPP_NAMESPACE::DOMDocument getDoc();
否则您将继续收到歧义错误或最差,它将在运行时假定错误的数据类型。
关于c++ - Xercesc的C++ “' DOMDocument':重新定义”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12591894/