【问题标题】:C++ "'DOMDocument' : redefinition" Error with XercescXercesc 的 C++“'DOMDocument':重新定义”错误
【发布时间】:2012-09-17 11:57:47
【问题描述】:

我的问题是 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 但这没有帮助。

【问题讨论】:

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


    【解决方案1】:

    我也遇到了类似的问题,一个定义来自 mshtml.h 文件,另一个来自 xercesc。 我正在使用三个课程 “DOM文档类型” “DOM异常” "DOMProcessingInstruction"

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

    谢谢

    【讨论】:

      【解决方案2】:

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

      据我所知,有 2 个库在其代码中的某处包括 msxml.h

      #include<Windows.h>
      

      #include<ole2.h>
      

      就我而言,#include &lt;Windows.h&gt; 恰好在我的#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的方式。

      希望这对遇到此问题的人有所帮助。

      注意:

      在定义这样的“DOMDocument”对象、参数和返回类型时,您必须始终包含命名空间,

      XERCES_CPP_NAMESPACE::DOMDocument xmlDoc;
      
      void setDoc(XERCES_CPP_NAMESPACE::DOMDocument xmlDoc);
      
      XERCES_CPP_NAMESPACE::DOMDocument getDoc();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多