c++ - 可能的 header 冲突

标签 c++ visual-studio-2010 xml-validation msxml6

我想根据 Visual C++ 中的 XSD 模式验证 XML 文件。我环顾了 Internet,发现 MSXML 示例似乎是最直接的。

我正在尝试整合 this进入我正在从事的项目。我创建了 XMLSchemaValidation类来对某些 XSD 架构执行验证,然后我使用相应的 XSD 文件名初始化对象。我在头文件中有以下指令:

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

但我开始遇到以下错误:

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 上。

我已经删除了 #define WIN32_LEAN_AND_MEAN在 stdafx.h 文件中(Errors using msxml6.h on visual c++)

我做错了什么?

最佳答案

这实际上不是 header 冲突,而是名称冲突。如果您在同一翻译单元中包含声明相同名称的不同库的 header ,并且这些库中的一个或多个未在适当的 namespace 内声明冲突名称,或者如果您(或上帝禁止,其中一个库 header )使用 using 指令将名称倒入命名空间范围。

那么您可以做些什么来消除错误:

首先,扫描代码中的 using 指令,尤其是 using namespace Gdiplus;using Gdiplus::Font;,因为这似乎是冲突的名称。然后通常尽量避免在同一翻译单元中包含 GDIPlus 和 comdef header 。最好通过将这两种包含限制到 .cpp 文件来完成。如果您绝对必须在 header 中包含其中一个 header ,则该 header 本身应限制在给定的子模块中,而其他 header 不应在整个子模块中使用。
有时您可能想使用这两个库的功能。如果是这种情况,您仍然可以通过为您想要使用每个库的功能提供一个接口(interface)来分离库本身的使用。这样您就封装了库的使用,并可以控制接口(interface)中的名称以避免在您使用这两种功能时发生冲突。

这是一些非常笼统的文本 - 如果您向我们展示产生问题的代码,我们可以给出示例。

关于c++ - 可能的 header 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19769889/

相关文章:

C++ 在运行时从编译时已知集/枚举中选择模板非类型参数

c++ - 有没有办法在 C++ 中反转数组的顺序?

c++ - prims 算法中父数组始终为零

visual-studio-2010 - 如何使用 Visual Studio 2010 强制调试的应用程序在辅助监视器中打开

c++ - 函数调用期间未正确保存 ESP 的值

c++ - Mersenne Twister 随机生成器 - 两个 VS2010 并行运行

jboss - StAXSource 未被 JBoss EAP 6.1 中的验证器接受

c++ - 如果我在指向 vector std::vector<Object*>* 的指针上调用 "delete",元素也会被删除吗?

java - XML验证: Am I Doing It Right?

xml - 在 XSD 中扩展复杂类型的示例?