错误 C2011:"XX":"类"类型重定义
Error C2011: 'XX' : 'class' type redefinition
我有这个编译器错误(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; }
如果您在开发站点上有多个项目分支,并使用符号链接指向其中一个分支,您也可能会得到此错误。
让我们假设你的解决方案有两个不同的分支Project1
和Project2
,你让一个名为Project
的符号链接指向Project1
或Project2
。
这个想法是,你可以在分支之间切换,项目总是显示为Project
到你的应用程序,可能还有一些其他工具期望它在那里。
免责声明:是的,版本控制可以在分支之间切换,但这样你就不必每次切换分支时都重新构建整个应用程序。此外,这两个分支仍然可以在版本控制之下。
好的,那么打开Project
会打开Project1
或Project2
,这取决于符号链接。符号链接可以通过一些简单的mklink_1
和mklink_2
之类的脚本文件删除/创建。
陷阱来了:
如果你不注意,直接打开位置1或2的解决方案(而不是在Visual Studio中遵循目录符号链接),预处理器可能会被欺骗,将Project1MyHeader.h
(或MyProject2MyHeader.h
)与MyProjectMyHeader.h
混合!
即使它们在技术上是相同的文件,预处理器也不知道符号链接。所以这里#pragma once
救不了你!
- 使用QJsEngine在Qt中注册自定义类型
- 在UE4中使用未定义类型'UTextBlock'
- 修改"std::set"中用户定义类型的值
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使自定义类型在unordered_map中用作键
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 为什么转换函数声明不需要至少一个定义类型说明符
- 标准::原子中的自定义类型
- 如何使用自定义类型声明Arduino数组?
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 在自定义类型图中重用 SWIG 映射
- 扩展自定义类型的spdlog
- vim使用户定义类型的COLOR与C++中的基本类型相同
- 重载自定义类型的 std::to_string 和 std::to_chars?
- 具有未声明/未定义类型的 typedef 结构
- 函数重载:内置类型与用户定义类型