C ++“'DOMDocument':redefinition”Xercesc出错

时间:2012-09-25 22:15:32

标签: c++ namespaces header-files msxml xerces

我的问题是Xerces和Windows都有一个'DOMDocument'对象。 Xerces以及我读过的所有内容hereherehere建议定义命名空间或取消定义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标头。很难说是什么导致了这个问题,因为错误出现在微软的标题中。

我还在整个项目中搜索了'DOMDocument',我使用的任何地方'DOMDocument'的名称空间都为XERCES_CPP_NAMESPACE

注意:我正在使用xerces 3.1和VS 2010.

想法?

更新 我在添加xerces标头之前尝试了#undef并且我仍然收到错误。所以我真的很遗憾为什么这两种解决方案都不适合我。

更新2: 我也尝试将名称空间从XERCES_CPP_NAMESPACE::DOMDocument更改为xercesc::DOMDocument,但这没有帮助。

2 个答案:

答案 0 :(得分:4)

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

我知道有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();

或者您将继续收到歧义错误或最差它会在运行时采用错误的数据类型。

答案 1 :(得分:2)

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

在更改订单后,

由于