Ошибка C2011: «XX»: переопределение типа «класс»

У меня есть эта ошибка компилятора (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;
};

6

Решение

Включить охрану:

#ifndef FILE_H
#define FILE_H

//file contents here

#endif

По этой причине заголовочные файлы должны включать в себя элементы защиты — многократное включение в одну и ту же единицу перевода может привести к множественному определению.

Альтернатива использует

#pragma once

но это поддерживается не всеми компиляторами.

28

Другие решения

Если кто-то еще сталкивается с этой ситуацией, это может произойти, когда библиотека включается в свойство проекта, а заголовочные файлы из этой библиотеки включаются в файл проектов.

0

Неверная предварительная декларация

Еще одна возможная причина, если вы такой глупец, как я, может быть то, что вы использовали enum вместо class когда вперед объявляет class,

File1.h

namespace MyNamespace { enum NotActuallyAnEnum; }

File2.h

class NotActuallyAnEnum

{
...
}

Это приведет к следующей ошибке:

error C2011: 'enum' type redefinition

Очевидно, что исправление заключается в исправлении предварительной декларации:

namespace MyNamespace { class NotActuallyAnEnum; }
0

Вы также можете получить эту ошибку, если у вас есть несколько веток вашего проекта на вашей станции разработки и вы используете символическую ссылку, чтобы указать на одну из них.

Предположим, у вас есть две разные ветви вашего решения под названием Project1 а также Project2 и вы даете символическую ссылку под названием Project указать либо Project1 или же Project2,

Идея состоит в том, что вы можете переключаться между ветками, и проект всегда будет выглядеть Project для вашего приложения и, возможно, некоторые другие инструменты, которые ожидают его там.

отказДа, управление версиями может переключаться между ветвями, но таким образом вам не придется перестраивать все приложение каждый раз, когда вы переключаете ветки. Кроме того, обе ветви все еще могут находиться под контролем версий.

Хорошо, так что открытие Project откроется либо Project1 или же Project2 в зависимости от символической ссылки. Символическая ссылка может быть удалена / создана каким-то простым mklink_1 а также mklink_2 как файлы сценариев.

Здесь идет ловушка:

Если вы не обращаете внимания и непосредственно открываете решение в местоположении 1 или 2 напрямую (вместо того, чтобы следовать символической ссылке на каталог в Visual Studio), препроцессор может быть обманут в смешивании Project1\MyHeader.h (или же MyProject2\MyHeader.h) с MyProject\MyHeader.h!

Даже это технически один и тот же файл, препроцессор не знает о символической ссылке. Так вот #pragma once не спасет тебя!

0
По вопросам рекламы [email protected]