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"

xercesXMLClass.hヘッダーが含まれています。エラーがMicrosoftヘッダーに表示されるため、問題の原因を特定するのは非常に困難です。

'DOMDocument'また、プロジェクト全体で検索しました'DOMDocument'が、使用するすべての場所に名前空間がありXERCES_CPP_NAMESPACEます。

注:私はxerces3.1とVS2010を使用しています。

アイデア?

更新:#undef xercesヘッダーを追加する前に 試しましたが、まだエラーが発生します。ですから、なぜ両方のソリューションがうまく機能しないのか、私は本当に迷っています。

更新2:XERCES_CPP_NAMESPACE::DOMDocument名前空間をからに 変更しようとしましxercesc::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名前空間に注意を払い、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();

または、あいまいなエラーが引き続き発生するか、最悪の場合、実行時に間違ったデータ型を想定します。

于 2012-09-27T23:15:58.607 に答える
2

また、1つの定義がmshtml.hファイルからのもので、別の定義がxercescからのものであるという同様の問題に直面しました。「DOMDocumentType」「DOMException」「DOMProcessingInstruction」を使用していた3つのクラスがありました

順序を変更した後、それは機能しました

ありがとう

于 2015-05-07T05:42:20.177 に答える