2012-09-25 69 views
2

我的问题是,Xerces和Windows都有一个'DOMDocument'对象。 Xerces和几乎所有我读过的东西here,herehere建议定义命名空间或undefine DOMDocument,应该看起来像这样。C++“'DOMDocument':重新定义”与Xercesc错误

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的头。很难说出是什么原因导致了这个问题,因为这个错误显示在微软的头文件中。

我也在整个项目中搜索'DOMDocument',并且在任何地方使用'DOMDocument'都有一个命名空间XERCES_CPP_NAMESPACE

注:我使用的Xerces 3.1和VS 2010

想法?

更新: 我已经加入了Xerces头,我仍然收到错误尝试过#undef。所以我真的很迷茫,为什么两种解决方案都不适合我。

更新2: 我也试着改变从XERCES_CPP_NAMESPACE::DOMDocument的命名空间xercesc::DOMDocument,但这并没有帮助。

回答

4

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

有2个库,我所知道的,其中包括msxml.h某处他们的代码里面,

#include<Windows.h> 

#include<ole2.h> 

在我的情况#include <Windows.h>碰巧的下游我的#include "XMLClass.h"。因此,解决办法是xerces这样之前定义msxml.h

#include<msxml.h>    //defines DOMDocument first  
//defines DOMDocument with a different namespace 
#include <xercesc/dom/DOMDocument.hpp> 

因为xerces铭记命名空间和微软是不是,如果报头在这样相反的顺序定义,

#include <xercesc/dom/DOMDocument.hpp> 
#include<msxml.h> 

不管你做什么你的代码都不会编译。编译器会告诉你,你正在重新定义'DOMDocument',这实际上是发生了什么。这是因为微软写道msxml.h

希望这有助于任何人碰到这个问题。

注:

定义时,“DOM文档”的对象,参数和返回类型这样,

XERCES_CPP_NAMESPACE::DOMDocument xmlDoc; 

void setDoc(XERCES_CPP_NAMESPACE::DOMDocument xmlDoc); 

XERCES_CPP_NAMESPACE::DOMDocument getDoc(); 

,或者您将继续收到歧义错误或您必须始终包括命名空间最差它将在运行时假定错误的数据类型。

2

我也面临着其中一个定义是从mshtml.h文件来类似的问题,另一个来自xercesc。 有三个班我使用 “DOMDocumentType” “抛出:DOMException” “DOMProcessingInstruction”

和更改订单后,它的工作

感谢