2013-11-04 42 views
3

我想在Visual C++中針對XSD模式驗證XML文件。我環顧了互聯網,我發現的MSXML例子似乎是最直接的。可能的標題衝突

我正在嘗試將this集成到我正在處理的項目中。我創建了XMLSchemaValidation類來對某些XSD模式執行驗證,並使用相應的XSD文件名初始化對象。我在頭文件中的下列指令:

#import "C:\Windows\System32\msxml6.dll" 

,但我開始收到以下錯誤的looot:

7>d:\proiecte\wtlcommon\basegui\gdiplushelpers.h(28): error C2872: 'Font' : ambiguous symbol 
7>   could be 'c:\program files (x86)\microsoft visual studio 10.0\vc\include\comdef.h(312) : Font' 
7>   or  'c:\program files (x86)\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(244) : Gdiplus::Font' 

,我也得到:

7>...\wizarddlgskin.h(96): error C2259: 'Font' : cannot instantiate abstract class 
7>   due to following members: 
7>   'HRESULT IUnknown::QueryInterface(const IID &,void **)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\unknwn.h(116) : see declaration of 'IUnknown::QueryInterface' 
7>   'ULONG IUnknown::AddRef(void)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\unknwn.h(120) : see declaration of 'IUnknown::AddRef' 
7>   'ULONG IUnknown::Release(void)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\unknwn.h(122) : see declaration of 'IUnknown::Release' 
7>   'HRESULT IDispatch::GetTypeInfoCount(UINT *)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2123) : see declaration of 'IDispatch::GetTypeInfoCount' 
7>   'HRESULT IDispatch::GetTypeInfo(UINT,LCID,ITypeInfo **)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2126) : see declaration of 'IDispatch::GetTypeInfo' 
7>   'HRESULT IDispatch::GetIDsOfNames(const IID &,LPOLESTR *,UINT,LCID,DISPID *)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2131) : see declaration of 'IDispatch::GetIDsOfNames' 
7>   'HRESULT IDispatch::Invoke(DISPID,const IID &,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,UINT *)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2138) : see declaration of 'IDispatch::Invoke' 

我最初有#import <msxml.dll>與示例代碼一樣,但MSXML安裝不會將這些文件放在W7上的位置。

我已經在stdafx.h中文件中刪除#define WIN32_LEAN_AND_MEANErrors using msxml6.h on visual c++

我在做什麼錯?

+2

如果你可以發佈你的代碼,人們可以更好地幫助你。 – doptimusprime

回答

1

這不是真正的標題衝突,而是名稱衝突。如果在同一翻譯單元中包含聲明相同名稱的不同庫的標題,並且這些庫中的一個或多個不在相應的名稱空間內聲明衝突名稱,或者如果您(或上帝禁止),則其中一個庫頭文件)使用using指令將名稱倒出到命名空間範圍中。

那麼,什麼可以做,以擺脫錯誤的:

首先,掃描您的代碼使用的指令,尤其是對using namespace Gdiplus;using Gdiplus::Font;因爲這似乎是衝突的名稱。然後通常儘量避免在同一個翻譯單元中包含GDIPlus和comdef頭文件。這最好通過限制兩種包含到.cpp文件來完成。如果您絕對必須將其中的一個包含在標題中,則該標題本身應限制爲給定的子模塊,而其他標題不應用於整個子模塊。
可能有一點您要使用這兩個庫的功能。如果是這種情況,您仍然可以通過爲每個libray的功能提供一個接口來分離使用這些庫本身。這樣,您可以封裝庫的使用,並可以控制接口中的名稱,以避免在使用這兩種功能的地方發生衝突。

這是一些非常普遍的文本 - 如果您向我們顯示出現問題的代碼,可以給出示例。

+0

問題解決了,但我不明白爲什麼。問題是我已經將'msxml6.dll'導入到頭文件中,而不是.cpp文件。我不明白爲什麼這會導致錯誤。 – GreatDane

+1

通過將其導入到包含標題的任何翻譯單元中,直接或間接地將其導入到標題中 - 顯然包括其他名稱也已知的TU,從而導致名稱衝突。 –