0

我正在使用 VS 2010 Ultimate。工具集 v90。

我有一个 DLL 和一个静态链接到 DLL 的测试项目。DLL 内部是一个名为 IFilter 的导出类。这个接口类被包装在一个命名空间中,该类的用法使用命名空间明确说明,例如 void DoSomethingWithDLLTypes( const Observer::IFilter &);

几个月来一切都运行良好,然而,随着最近在 DLL 项目之外的更改,我开始引入新文件。当我将这些文件添加到解决方案中时,使用每个添加到测试进行重建,一切都运行良好,然后突然我收到了这个错误。

C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\Filter.h(53): 警告 C4099: 'Observer::IFilter' : type name first seen using 'class' now see using 'struct' d: \proj\pub\h\IFilter.h(12) : 参见 'Observer::IFilter' C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\Filter.h(183) 的声明:错误 C2371: 'IFilter':重新定义;不同的基本类型 C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\Filter.h(53) :参见“IFilter”声明

最初 IFilter 没有包装在命名空间中,所以我必须检查所有文件(认为这会解决它)并将所有内容包装在命名空间中。现在,DLL 编译得很好,但是,我在测试项目中仍然遇到同样的错误。我什至不知道如何/为什么包含来自 MS SDK 的 IFilter/Filter.h。

测试项目使用预编译的头文件,但是,它没有使用 Windows.h,无论哪种方式,我都继续并在那里“只是为了确定”做了 #define lean_and_mean 宏,没有任何帮助。

4

1 回答 1

0

Visual Studio 编译器不符合标准的地方之一。根据标准,structandclass关键字可以互换使用来声明相同的类型,但是 VS 对定义为的类型有不同的修饰,struct因此class它要求您始终为您的类型使用一个或另一个关键字。

现在,错误指向两个看似无关的头文件,所以它可能只是名称冲突:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\Filter.h
d:\proj\pub\h\IFilter.h

在第一个标题中有一个class Observer::IFilter,在第二个标题中有struct Observer::IFilter。如果它们相同,那么您应该修复项目,使其不包含多个带有定义的标题,如果它们是不同的东西,那么您应该使名称唯一(添加命名空间)

于 2012-08-01T21:49:54.723 回答