我的问题是 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
#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处理指令” 更改顺序后它起作用了
我在尝试 Unity 构建时遇到了这个问题。
我解决了这个问题:
#include <ole2.h>
在任何 Xerces 标头之前。