错误 C2011:"XX":"类"类型重定义

Error C2011: 'XX' : 'class' type redefinition

本文关键字:定义 类型 XX C2011 错误      更新时间:2023-10-16

我有这个编译器错误(C2011)与这段代码。我不知道它出了什么问题。

名称空间(Ogre)没有PlaneMovement的定义。我还尝试了一个不同的名称,仍然是相同的错误。

#include <Ogre.h>
using namespace Ogre;
class PlaneMovement
{
public:
    PlaneMovement(Degree startingAngle, Real velocity = 2, Real gravity = 2);
    Vector2 updateMovement(const FrameEvent& evt);
private:
    Degree currentAngle;
    Real currentVelocityX;
    Real currentVelocityY;
    Real gravity;
    bool top;
};

Include:

#ifndef FILE_H
#define FILE_H
//file contents here
#endif

头文件应该有include保护正是出于这个原因——在同一个翻译单元中多次包含可能导致多个定义。

另一个选择是使用

#pragma once

如果其他人面临这种情况,可能是当库包含在项目的属性中以及该库的头文件包含在项目文件中时。

错误的前向声明

另一个可能的原因,如果你是一个像我一样的傻瓜,可能是你使用enum而不是class时转发声明一个class

File1.h

namespace MyNamespace { enum NotActuallyAnEnum; }

File2.h

class NotActuallyAnEnum
{
...
}

这会产生如下错误:

error C2011: 'enum' type redefinition

显然,修复方法是纠正forward声明:

namespace MyNamespace { class NotActuallyAnEnum; }

如果您在开发站点上有多个项目分支,并使用符号链接指向其中一个分支,您也可能会得到此错误。

让我们假设你的解决方案有两个不同的分支Project1Project2,你让一个名为Project的符号链接指向Project1Project2

这个想法是,你可以在分支之间切换,项目总是显示为Project到你的应用程序,可能还有一些其他工具期望它在那里。

免责声明:是的,版本控制可以在分支之间切换,但这样你就不必每次切换分支时都重新构建整个应用程序。此外,这两个分支仍然可以在版本控制之下。

好的,那么打开Project会打开Project1Project2,这取决于符号链接。符号链接可以通过一些简单的mklink_1mklink_2之类的脚本文件删除/创建。

陷阱来了:

如果你不注意,直接打开位置1或2的解决方案(而不是在Visual Studio中遵循目录符号链接),预处理器可能会被欺骗,将Project1MyHeader.h(或MyProject2MyHeader.h)与MyProjectMyHeader.h混合!

即使它们在技术上是相同的文件,预处理器也不知道符号链接。所以这里#pragma once救不了你!