C++“'DOMDocument':重新定义”Xercesc 错误

问题描述 投票:0回答:3

我的问题是 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。

想法?

更新: 在添加 xerces 标头之前我已经尝试过

#undef

,但仍然收到错误。所以我真的很困惑为什么这两种解决方案都不适合我。

更新2: 我还尝试将命名空间从

XERCES_CPP_NAMESPACE::DOMDocument
更改为

xercesc::DOMDocument

但这没有帮助。

这是一个标头加载顺序问题。 

我知道有 2 个库在其代码中包含

msxml.h
c++ namespaces header-files msxml xerces
3个回答
4
投票

#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'
,这实际上是正在发生的事情。这是因为微软的书写方式

msxml.h

希望这可以帮助任何遇到这个问题的人。


注:

在定义“DOMDocument”对象、参数和返回类型时,必须始终包含命名空间,

XERCES_CPP_NAMESPACE::DOMDocument xmlDoc; void setDoc(XERCES_CPP_NAMESPACE::DOMDocument xmlDoc); XERCES_CPP_NAMESPACE::DOMDocument getDoc(); 或者您将继续收到歧义错误,或者

最糟糕的是

它将在运行时假定错误的数据类型。


我也遇到了类似的问题,其中一个定义来自 mshtml.h 文件,另一个定义来自 xercesc。 我使用了三个课程 “DOM文档类型” “DOM异常” “DOM处理指令” 更改顺序后它起作用了


2
投票

我在尝试 Unity 构建时遇到了这个问题。

我解决了这个问题:


0
投票
#include <ole2.h>

在任何 Xerces 标头之前。


© www.soinside.com 2019 - 2024. All rights reserved.