我的问题是Xerces和Windows都具有'DOMDocument'对象。 Xerces和几乎所有我读过的hereherehere都建议定义 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/

10-13 04:23