错误C2011:'XX':'类'类型重新定义

时间:2013-01-04 20:31:01

标签: c++ class

我有这段代码的编译错误(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;
};

4 个答案:

答案 0 :(得分:28)

加入警卫:

#ifndef FILE_H
#define FILE_H

//file contents here

#endif

头文件应该包含这个确切原因的保护 - 多个包含在同一个翻译单元中可以导致多重定义。

另一种方法是使用

#pragma once

但并非所有编译器都支持。

答案 1 :(得分:0)

如果其他人遇到这种情况,可能是当库包含项目属性时,此库中的头文件包含在项目文件中。

答案 2 :(得分:0)

不正确的转发声明

另一个可能的原因,如果你像我这样的傻瓜,可能是你在前面声明enum时使用了class而不是class

File1.h

namespace MyNamespace { enum NotActuallyAnEnum; }

File2.h

class NotActuallyAnEnum

{
...
}

这将产生类似以下错误的内容:

error C2011: 'enum' type redefinition

显然,解决方法是纠正前方声明:

namespace MyNamespace { class NotActuallyAnEnum; }

答案 3 :(得分:0)

如果您的开发工作站上有多个项目分支并使用符号链接指向其中一个分支,则可能会出现此错误。

假设您有两个不同的解决方案分支,名为Project1Project2,您可以将名为Project的符号链接指向Project1或{ {1}}。

我们的想法是,您可以在分支之间切换,项目对您的应用程序看起来总是Project2,也可能是其他一些期望它的工具。

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

好的,开放Project会打开ProjectProject1,具体取决于符号链接。可以通过一些简单的Project2mklink_1脚本文件删除/创建符号链接。

这就是陷阱:

如果您没有注意并直接在1或2位置直接打开解决方案(而不是使用Visual Studio跟踪目录符号链接),预处理器可能会被混入mklink_2(或Project1\MyHeader.hMyProject2\MyHeader.h

即使这些文件在技术上是相同的文件,预处理器也不了解符号链接。所以这里MyProject\MyHeader.h不会救你!