C++ 构建失败:重新定义;不同的基本类型&;使用';类别';现在可以看到使用';结构';

C++ 构建失败:重新定义;不同的基本类型&;使用';类别';现在可以看到使用';结构';,c++,visual-studio-2010,visual-studio,C++,Visual Studio 2010,Visual Studio,我用的是VS2010终极版。工具集v90 我有一个DLL和一个静态链接到DLL的测试项目。DLL中有一个导出的类,称为IFilter。这个接口类被包装在一个名称空间中,所述类的用法是使用名称空间明确说明的,例如。 void DoSomethingWithDLLTypes(const Observer::IFilter&) 几个月来一切都很好,但是,随着DLL项目之外的最新更改,我开始引入新文件。当我将这些文件添加到解决方案中,并使用每个添加到测试进行重建时,一切都正常工作,然后突然出现了这个错误

我用的是VS2010终极版。工具集v90

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

几个月来一切都很好,但是,随着DLL项目之外的最新更改,我开始引入新文件。当我将这些文件添加到解决方案中,并使用每个添加到测试进行重建时,一切都正常工作,然后突然出现了这个错误

C:\Program Files\Microsoft SDK\Windows\v6.0A\include\Filter.h(53):警告C4099:“Observer::IFilter”:首先使用“类”看到的类型名称,现在使用“结构”看到的类型名称 d:\proj\pub\h\IFilter.h(12):参见“Observer::IFilter”的声明 C:\Program Files\Microsoft SDK\Windows\v6.0A\include\Filter.h(183):错误C2371:“IFilter”:重新定义;不同的基本类型 C:\Program Files\Microsoft SDK\Windows\v6.0A\include\Filter.h(53):请参阅“IFilter”的声明

最初IFilter并没有封装在名称空间中,所以我必须遍历所有文件(认为这可以解决问题),并将所有内容封装在名称空间中。现在,DLL编译得很好,但是,我在测试项目中仍然遇到同样的错误。我甚至不知道MSSDK中的IFilter/Filter.h是如何/为什么被包括在内的


测试项目使用预编译的头文件,但是,它没有使用Windows.h,不管怎样,我继续进行,并且“只是为了确保”中的“define lean”和“mean”宏没有任何帮助。

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

现在,错误指向两个看似不相关的头文件,因此可能只是名称冲突:

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

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

IFilter是windows索引服务插件的接口。项目中的某些内容包括一个头文件,该头文件将定义拉入。在编译过程中更改项目设置以转储包含文件层次结构,并查看是否可以将其跟踪到起始点。感谢您的快速响应,我将尝试此操作并返回。@CaptainObvlious:错误消息命名了声明类型的两个标头,无需转储整个层次结构(除非你想知道它为什么被包括在内,而不是什么被包括在内)@DavidRodríguez Dribea知道为什么可能是一个好主意,以防他再次遇到它。上次我检查VS时不要求一致地使用
struct
class
,也不影响名称损坏。也就是说,编译器的行为完全符合要求。在这种情况下发出警告是一个好主意,因为在这种情况下on表示可能存在无意中的名称冲突。@AndreyT:我似乎记得这是过去的一个问题。我必须承认,我已经很长时间没有使用VS了,他们可能已经在编译器(以相同的方式损坏符号)甚至链接器(例如,将两个符号都视为别名)中纠正了这一点我无法检查VS编译器的旧版本,但VS2005似乎没有任何与混合
struct
class
有关的问题。它确实发出了警告,但仍然对它们进行相同的处理。我定义的IFilter.h包装在命名空间中,是一个类。我从未在VS2005中的任何地方使用“using namespace”对于任何名称空间,所有内容都是显式拼写的。另一个标题(将其类型定义为结构)是Microsoft SDK的一部分。我无法理解如何将名称colide和一个名称空间包装在一起。最终的修复方法是我必须将我的类全部重命名,我不知道为什么。