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

我还在'DOMDocument'整个项目中搜索过,我使用的任何地方'DOMDocument'都有一个XERCES_CPP_NAMESPACE.

注意:我使用的是 xerces 3.1 和 VS 2010。

想法?

更新:#undef在添加 xerces 标头之前尝试过,但我仍然收到错误。所以我真的很困惑为什么这两种解决方案都不适合我。

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

4

2 回答 2

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注意到了命名空间而微软没有,如果像这样以相反的顺序定义标题,

#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();

否则您将继续收到歧义错误,或者最糟糕的是它会在运行时假定错误的数据类型。

于 2012-09-27T23:15:58.607 回答
2

我也遇到了类似的问题,一个定义来自 mshtml.h 文件,另一个来自 xercesc。我使用了三个类“DOMDocumentType”“DOMException”“DOMProcessingInstruction”

在改变了它的工作顺序之后

谢谢

于 2015-05-07T05:42:20.177 回答