One of the header files is as follows —
#include "stdafx.h"
class AAA
{
public:
std::string strX;
std::string strY;
};
When I try to compile the project, I get the error
error C2011: 'AAA' : 'class' type redefinition
Nowhere else in my program have I redefined the class AAA. How do I fix this?
meJustAndrew
6,0318 gold badges51 silver badges76 bronze badges
asked Sep 7, 2014 at 19:01
1
Change to code to something like this:
#ifndef AAA_HEADER
#define AAA_HEADER
#include "stdafx.h"
class AAA
{
public:
std::string strX;
std::string strY;
};
#endif
If you include this header file more than once in some source file, include guards will force compiler to generate class only once so it will not give class redefinition error.
answered Sep 7, 2014 at 19:06
AshotAshot
10.8k14 gold badges66 silver badges118 bronze badges
3
Adding
#pragma once
to the top of your AAA.h file should take care of the problem.
like this
#include "stdafx.h"
#pragma once
class AAA
{
public:
std::string strX;
std::string strY;
};
answered Jun 7, 2016 at 18:09
emptyempty
5,2143 gold badges32 silver badges58 bronze badges
1
In addition to the suggested include guards you need to move #include «stdafx.h» out of the header. Put it at the top of the cpp file.
answered Sep 7, 2014 at 20:17
ScottMcP-MVPScottMcP-MVP
10.4k2 gold badges15 silver badges15 bronze badges
I met this problem today in VS 2017. I added #pragma once, but it didn’t work until I added a macro definition:
// does not work
#pragma once
// works with or without #pragma once
#ifndef _HEADER_AAA
#define _HEADER_AAA
//
// my code here....
//
#endif
I have no clue how to explain this, but it is a solution for me.
Yun
3,0566 gold badges9 silver badges28 bronze badges
answered Sep 15, 2021 at 5:48
There are two ways to go about this but you can’t use both. Make sure to wrap the class definition with a compiler directive that the class declaration only gets compiled once:
#include "stdafx.h"
#pragma once
class AAA{
public:
std::string strX;
std::string strY;
};
-or-
#include "stdafx.h"
#ifndef AAA_HEADER_
#define AAA_HEADER_
class AAA
{
public:
std::string strX;
std::string strY;
};
#endif
Also: note the class import statement should be at the top of your file.
answered Feb 10 at 3:20
Есть главный файл main.cpp и main.h. В main.cpp подключается заголовок Engine.h. Компилятор выдает ошибку переопределения типа «class»
main.cpp
#include "main.h"
#include "Engine.h"
using namespace std;
int main()
{
Game game = Game("init");
cout << game.getState() << endl;
return 0;
}
main.h
#pragma once
#include <iostream>
Engine.cpp
#include "Engine.h"
using namespace std;
class Game
{
public:
Game(string state)
{
this->state = state;
}
string getState()
{
return this->state;
}
private:
string state;
};
Engine.h
#pragma once
#include <string>
using namespace std;
class Game
{
public:
Game(string state);
string getState();
private:
string state;
};
Собирается через CMake
Harry
217k15 золотых знаков117 серебряных знаков229 бронзовых знаков
задан 1 апр в 11:26
Рассмотрим ваш Engine.cpp:
#include "Engine.h"
using namespace std;
class Game
{
public:
Т.е., когда будет включен ваш Engine.h, получится что-то вроде
#include <string>
using namespace std;
class Game
{
public:
Game(string state);
string getState();
private:
string state;
};
using namespace std;
class Game
{
public:
...
Т.е. класс Game у вас определяется в этой единице трансляции дважды.
Дальше пояснять не нужно?
ответ дан 1 апр в 11:30
HarryHarry
217k15 золотых знаков117 серебряных знаков229 бронзовых знаков
Повторно определять класс class Game { нельзя.
А в Engine.cpp можно сделать полное определение методов которые вы предварительно объявили так :
# include "Engine.h"
Game :: Game(string state)
{
this->state = state;
}
string Game :: getState()
{
return this->state;
}
где Game :: означает область (класс), для кого эта функция определяется.
ответ дан 1 апр в 12:43
AlexGlebeAlexGlebe
17k1 золотой знак9 серебряных знаков33 бронзовых знака
В проекте есть 3 файла: объявление класса в Auto.h, реализация его методов в Auto.cpp и основной код программы в AutoCenter.cpp.
Вот файл класса Auto.h:
#include <iostream>
#include "stdafx.h"
#include "windows.h"
#include <string>
using namespace std;
class Auto {
private:
int year;
int ownersNumber;
string color;
string brand;
string model;
public:
void setYear(int y);
void setOwnersNumber(int n);
void setColor(string c);
void setBrand(string b);
void setModel(string m);
int getYear();
int getOwnersNumber();
string getColor();
string getBrand();
string getModel();
void displayAll();
};
Вот файл его реализации Auto.cpp:
#include "stdafx.h"
#include "windows.h"
#include "Auto.h"
#include <string>
#include <iostream>
void Auto::setYear(int y) {
year = y;
}
void Auto::setBrand(string b) {
brand = b;
}
void Auto::setModel(string m) {
model = m;
}
void Auto::setColor(string c) {
color = c;
}
void Auto::setOwnersNumber(int n) {
ownersNumber = n;
}
int Auto::getYear() {
return year;
};
int Auto::getOwnersNumber() {
return ownersNumber;
};
string Auto::getColor() {
return color;
};
string Auto::getBrand() {
return brand;
};
string Auto::getModel() {
return model;
};
Вот основной код:
#include <iostream>
#include "stdafx.h"
#include "windows.h"
#include "Auto.h"
#include "Auto.cpp"
#include <string>
using namespace std;
int main()
{
Auto auto1;
auto1.setBrand("Mercedes");
auto1.setModel("C200");
auto1.setColor("red");
auto1.setYear(2005);
auto1.setOwnersNumber(2);
system("pause");
return 0;
}
На этапе компиляции вылетает 27 ошибок, основная причина которых — «Auto: переопределение типа class». Где тут переопределение, я не могу понять? Подскажите, в чём может быть ошибка? Или это VS гребет?
|
1 / 1 / 3 Регистрация: 28.01.2013 Сообщений: 169 |
|
|
1 |
|
|
06.11.2013, 23:23. Показов 9602. Ответов 3
Как я понял, ошибка «переопределение типа «class»» означает что класс уже был где-то объявлен, однако у меня он вроде нигде больше не объявлен. Вот снизу скрин и кину проект(потому-что 11 файлов и расписывать что тут где как-то неудобно) Миниатюры
0 |
|
I.M. 574 / 557 / 47 Регистрация: 16.12.2011 Сообщений: 1,389 |
||||
|
06.11.2013, 23:59 |
2 |
|||
первой строкой каждого *.h файла
1 |
|
ququ_smile 1 / 1 / 3 Регистрация: 28.01.2013 Сообщений: 169 |
||||
|
07.11.2013, 00:08 [ТС] |
3 |
|||
|
первой строкой каждого *.h файла Класс, работает, а что это и зачем это?
0 |
У меня есть эта ошибка компилятора (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

