2012-09-25 70 views
2

我的問題是,Xerces和Windows都有一個'DOMDocument'對象。 Xerces和幾乎所有我讀過的東西here,herehere建議定義命名空間或undefine DOMDocument,應該看起來像這樣。C++「'DOMDocument':重新定義」與Xercesc錯誤

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,但這並沒有幫助。

回答

4

這是一個標題加載順序問題。

有2個庫,我所知道的,其中包括msxml.h某處他們的代碼裏面,

#include<Windows.h> 

#include<ole2.h> 

在我的情況#include <Windows.h>碰巧的下游我的#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

希望這有助於任何人碰到這個問題。

注:

定義時,「DOM文檔」的對象,參數和返回類型這樣,

XERCES_CPP_NAMESPACE::DOMDocument xmlDoc; 

void setDoc(XERCES_CPP_NAMESPACE::DOMDocument xmlDoc); 

XERCES_CPP_NAMESPACE::DOMDocument getDoc(); 

,或者您將繼續收到歧義錯誤或您必須始終包括命名空間最差它將在運行時假定錯誤的數據類型。

2

我也面臨着其中一個定義是從mshtml.h文件來類似的問題,另一個來自xercesc。 有三個班我使用 「DOMDocumentType」 「拋出:DOMException」 「DOMProcessingInstruction」

和更改訂單後,它的工作

感謝