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
5,6577 gold badges53 silver badges71 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.7k13 gold badges63 silver badges114 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
4,9923 gold badges32 silver badges57 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.3k2 gold badges14 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
2,8346 gold badges8 silver badges28 bronze badges
answered Sep 15, 2021 at 5:48
Вообщем-то весь код на данный момент рабочий и не выдаёт синтаксических ошибок. Но выскакивает 1 «прекрасная» ошибка «С2011 переопределение типа class». Как исправить, понятия не имею. Прошу помощи. Ошибка в H файле, в cpp пока-что ничего нет, даже вставлять не буду.
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
class Doctor
{
public:
void SetDiagnos();
void MenuOfDoctor();
void WriteTheOrgan();
string SetWhatTheOrgan();
};
class Aches
{
public:
virtual void Options() = 0;
};
class Cancer : public Aches
{
public:
void Options() override
{
Doctor *organ = new Doctor();
organ->WriteTheOrgan();
string Organ = organ->SetWhatTheOrgan();
cout << "t1. Химиотерапияn"
<< "t2. Антибиотикиn"
<< "t3. Пересадка органа" << Organ << endl
<< "t4. Обезболивающиеn"
<< "t5. Домашний режим с супчикомnn"
<< "Что дальше?";
switch (_getch())
{
case '1':
break;
case '2':
break;
case '3':
break;
case '4':
break;
case '5':
break;
}
}
};
class Aids : public Aches
{
public:
void Options() override
{
}
};
class SunStricke : public Aches
{
public:
void Options() override
{
}
};
class HeadAche : public Aches
{
public:
void Options() override
{
}
};
class Iche : public Aches
{
public:
void Options() override
{
}
};
class Patient
{
private:
string Ache;
int Health;
public:
string PationAche()
{
int B;
B = 1 + rand() % 5;
switch (B)
{
case (1):
{
Ache = "Cancer";
break;
}
case (2):
{
Ache = "Aids";
break;
}
case (3):
{
Ache = "HeadAche";
break;
}
case (4):
{
Ache = "SunStricke";
break;
}
case (5):
{
Ache = "Iche";
break;
}
}
return Ache;
}
};
class Doctor
{
private:
int Experience, IndeXOfDiagnos = 0, IndeXLookSimptoms = 0, IndeXOfAche = NULL;
string PatientAche, Organ;
public:
void Optoins(Aches *aches)
{
aches->Options();
}
void SetDiagnos()
{
if (IndeXLookSimptoms == 1)
{
cout << "t1. Ракn"
<< "t2. Спидn"
<< "t3. Солнечный ударn"
<< "t4. Головная больn"
<< "t5. Простудаnn"
<< "t6. Вернуться в менюn";
switch (_getch())
{
case '1':
IndeXOfDiagnos = 1;
PatientAche = "Рак";
IndeXOfAche = 1;
break;
case '2':
IndeXOfDiagnos = 1;
PatientAche = "Спид";
IndeXOfAche = 2;
break;
case '3':
IndeXOfDiagnos = 1;
PatientAche = "Солнечный удар";
IndeXOfAche = 3;
break;
case '4':
IndeXOfDiagnos = 1;
PatientAche = "Головная боль";
IndeXOfAche = 4;
break;
case '5':
IndeXOfDiagnos = 1;
PatientAche = "Простуда";
IndeXOfAche = 5;
break;
case '6':
IndeXOfDiagnos = 0;
break;
}
system("cls");
}
else cout << "Вы не можете поставить диагноз, до того, как ознакомитесь с симптомами -_- nn";
return MenuOfDoctor();
}
void MenuOfDoctor()
{
cout << "t1. Просмотреть симптомыn"
<< "t2. Просотреть мед.картуn"
<< "t3. Поставить диагнозn"
<< "t4. Назначить лечениеnn"
<< "Что дальше?";
switch (_getch())
{
case '1':
system("cls");
break;
case '2':
system("cls");
break;
case '3':
system("cls");
if (IndeXOfDiagnos == 1)
{
cout << "Диагноз уже стоит: " << PatientAche << endl << endl;
MenuOfDoctor();
}
else SetDiagnos();
break;
case '4':
system("cls");
switch (IndeXOfAche)
{
case (1):
Cancer cancer;
Optoins(&cancer);
break;
case (2):
Aids aids;
Optoins(&aids);
break;
case (3):
SunStricke sunstricke;
Optoins(&sunstricke);
break;
case (4):
HeadAche headache;
Optoins(&headache);
break;
case (5):
Iche iche;
Optoins(&iche);
break;
}
break;
}
}
void WriteTheOrgan()
{
int IndeX;
cout << "Выберите стадию рака:nn"
<< "t1. Первая (I)n"
<< "t2. Вторая (II)n"
<< "t3. Третья (III)n"
<< "t4. Четвёртая (IV)";
system("cls");
switch (_getch())
{
case '1':
IndeX = 1;
break;
case '2':
IndeX = 2;
break;
case '3':
IndeX = 3;
break;
case '4':
IndeX = 4;
break;
}
if (IndeX == 3 || IndeX == 4)
{
cout << "Опухоль локализована?nn"
<< "1 - Да 2 - Нет";
system("cls");
switch (_getch())
{
case '1':
cout << "Укажите орган в котором обнаружена первичная форма рака: ";
getline(cin, Organ);
break;
case '2':
Organ = "";
break;
}
}
else Organ = "";
}
string SetWhatTheOrgan()
{
return Organ;
}
};
У меня есть эта ошибка компилятора (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), препроцессор может быть обманут в смешивании Project1MyHeader.h
(или же MyProject2MyHeader.h
) с MyProjectMyHeader.h
!
Даже это технически один и тот же файл, препроцессор не знает о символической ссылке. Так вот #pragma once
не спасет тебя!
0
Below are by 4 classes, I’m learning about basic c++ syntax and boy is it much harder and less forgiving than other languages I have used. I have a main class, base class «BaseArray» and two sub classes «OrderedArray» and «UnorderedArray».
Main.cpp
#include <iostream>
#include "OrderedArray.cpp"
#include "UnorderedArray.cpp"
using namespace std;
int main() {
system("PAUSE");
return 0;
}
BaseArray.cpp
#include <iostream>
using namespace std;
class BaseArray {
public:
BaseArray::BaseArray() {
}
};
OrderedArray.cpp
#include <iostream>
#include "BaseArray.cpp"
using namespace std;
class OrderedArray : public BaseArray {
OrderedArray::OrderedArray() {
}
};
UnorderedArray.cpp
#include <iostream>
#include "BaseArray.cpp"
using namespace std;
class UnorderedArray : public BaseArray {
UnorderedArray::UnorderedArray() {
}
};
The errors I receive are as followed, from scouting other threads online. I think it might have to do with duplicate calling of classes. To be honest, I have no clue. If someone could point me in the right direction that would be nice, thanks in advance!
error C2011: 'BaseArray':'class' type redefinition
error C2504: 'BaseArray':base class undefined
To fix this error I can remove one of the includes at the top of main.cpp, but I need those to create objects and call functions from the subclasses later on.
Below are by 4 classes, I’m learning about basic c++ syntax and boy is it much harder and less forgiving than other languages I have used. I have a main class, base class «BaseArray» and two sub classes «OrderedArray» and «UnorderedArray».
Main.cpp
#include <iostream>
#include "OrderedArray.cpp"
#include "UnorderedArray.cpp"
using namespace std;
int main() {
system("PAUSE");
return 0;
}
BaseArray.cpp
#include <iostream>
using namespace std;
class BaseArray {
public:
BaseArray::BaseArray() {
}
};
OrderedArray.cpp
#include <iostream>
#include "BaseArray.cpp"
using namespace std;
class OrderedArray : public BaseArray {
OrderedArray::OrderedArray() {
}
};
UnorderedArray.cpp
#include <iostream>
#include "BaseArray.cpp"
using namespace std;
class UnorderedArray : public BaseArray {
UnorderedArray::UnorderedArray() {
}
};
The errors I receive are as followed, from scouting other threads online. I think it might have to do with duplicate calling of classes. To be honest, I have no clue. If someone could point me in the right direction that would be nice, thanks in advance!
error C2011: 'BaseArray':'class' type redefinition
error C2504: 'BaseArray':base class undefined
To fix this error I can remove one of the includes at the top of main.cpp, but I need those to create objects and call functions from the subclasses later on.
|
|
|
переопределение типа «class»
, чушь какая-то…
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Вот код:
#include <map> #include «pugixml.hpp» class Settings { public: void loadConfig(std::string filename) { pugi::xml_document config; config.load_file(filename.c_str()); if (pugi::xml_node root = config.child(«OiHotkeyConfig»)) { loadFonts(root.child(«Fonts»)); } }; HFONT getFont(std::wstring name) { return fonts[name]; }; private: std::map<std::wstring, HFONT> fonts; void loadFonts(pugi::xml_node fontsNode) { if (fontsNode) for (pugi::xml_node font = fontsNode.child(«Font»); font; font = font.next_sibling()) { HFONT curFont = CreateFont(font.attribute(«height»).as_int(), font.attribute(«width»).as_int(), 0, 0, font.attribute(«weight»).as_int(), font.attribute(«italic»).as_bool(), font.attribute(«underline»).as_bool(), font.attribute(«strikeout»).as_bool(), DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, (LPCWSTR)font.attribute(«face»).value() ); fonts[pugi::as_utf16(font.attribute(«name»).value())]=curFont; } }; }; Компилятор(VC++ 2008) ругается на объявление класса: Цитата d:моеprogrammingviewerviewersrcsettings.h(5) : error C2011: Settings: переопределение типа «class» Что это значит? и что делать? |
Twilight |
|
Senior Member Рейтинг (т): 24 |
а компилятор так и пишет сообщения на русском? |
Flex Ferrum |
|
Цитата miksayer @ 20.06.09, 11:12 Компилятор(VC++ 2008) ругается на объявление класса: концовку файла pugixml покажи, плз. |
kanes |
|
Цитата Twilight @ 20.06.09, 11:16 а компилятор так и пишет сообщения на русском? Может и на руском писать в русской студии |
miksayer |
|
концовка pugixml.hpp:
template <typename Predicate> inline xml_node xml_node::find_node(Predicate pred) const { if (!empty()) for (xml_node node = first_child(); node; node = node.next_sibling()) { if (pred(node)) return node; if (node.first_child()) { xml_node found = node.find_node(pred); if (found) return found; } } return xml_node(); } } #endif Цитата Twilight @ 20.06.09, 11:16 а компилятор так и пишет сообщения на русском? да, студия русская Цитата Twilight @ 20.06.09, 11:16 скорее всего он имеет в виду — что Settings уже объявлен нет, это не так |
Flex Ferrum |
|
miksayer, запяточие перед #endif поставь. |
miksayer |
|
блин, сколько раз уже на эти грабли наступал:
#ifndef SETTINGS_INCLUDED #define SETTINGS_INCLUDED …. #endif
отсюда и эта ошибка Добавлено 20.06.09, 11:30 Добавлено 20.06.09, 11:30 |
Flex Ferrum |
|
Цитата miksayer @ 20.06.09, 11:29 Flex Ferrum, да не в этом проблема, как оказалось И в этом тоже, я думаю. |
Alexandoros |
|
Цитата miksayer @ 20.06.09, 11:12 Компилятор(VC++ 2008) ругается на объявление класса: Цитата d:моеprogrammingviewerviewersrcsettings.h(5) : error C2011: Settings: переопределение типа «class» Что это значит? и что делать? Цитата
Compiler Error C2011 Выводы делай сам. Еще есть #pragma once. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Общие вопросы
- Следующая тема
[ Script execution time: 0,0333 ] [ 16 queries used ] [ Generated: 9.02.23, 12:11 GMT ]
Вы также можете получить эту ошибку, если у вас есть несколько веток вашего проекта на вашей станции разработки и вы используете символическую ссылку, чтобы указать на одну из них.
Предположим, у вас есть две разные ветки вашего решения, называемые Project1
и Project2
и вы разрешили символическую ссылку под названием Project
указать на любой Project1
or Project2
.
Идея состоит в том, что вы можете переключаться между ветвями, и проект всегда будет казаться Project
к вашему приложению и, возможно, некоторым другим инструментам, которые ожидают его там.
Дисклеймер: да, контроль версий может переключаться между ветками, но таким образом вам не придется пересобирать все приложение каждый раз, когда вы переключаете ветки. Кроме того, обе ветки могут по-прежнему находиться под контролем версий.
Ну так открывай Project
откроет либо Project1
or Project2
в зависимости от симлинка. Символическая ссылка может быть удалена/создана простым mklink_1
и mklink_2
как файлы сценариев.
Вот и подводный камень:
Если вы не обратите внимание и напрямую откроете решение в расположении 1 или 2 напрямую (вместо того, чтобы следовать символической ссылке каталога с Visual Studio), препроцессор может быть обманут в смешивании Project1MyHeader.h
(или MyProject2MyHeader.h
) С MyProjectMyHeader.h
!
Даже если технически это один и тот же файл, препроцессор не знает о символической ссылке. Так вот #pragma once
тебя бы не спас!
Один из файлов заголовков выглядит следующим образом:
#include "stdafx.h"
class AAA
{
public:
std::string strX;
std::string strY;
};
Когда я пытаюсь скомпилировать проект, я получаю сообщение об ошибке
error C2011: 'AAA' : 'class' type redefinition
Нигде в моей программе не было переопределено класс AAA
. Как это исправить?
07 сен. 2014, в 21:06
Поделиться
Источник
3 ответа
Измените код на что-то вроде этого:
#ifndef AAA_HEADER
#define AAA_HEADER
#include "stdafx.h"
class AAA
{
public:
std::string strX;
std::string strY;
};
#endif
Если вы включите этот файл заголовка более одного раза в некоторый исходный файл, включите защитники, чтобы заставить компилятор генерировать класс только один раз, чтобы он не выдавал ошибку class redefinition
.
Ashot
07 сен. 2014, в 19:34
Поделиться
Добавление
#pragma once
в верхней части вашего файла AAA.h следует позаботиться о проблеме.
как это
#include "stdafx.h"
#pragma once
class AAA
{
public:
std::string strX;
std::string strY;
};
empty
07 июнь 2016, в 18:28
Поделиться
В дополнение к предлагаемым включенным защитным устройствам вам нужно переместить #include «stdafx.h» из заголовка. Поместите его в начало файла cpp.
ScottMcP-MVP
07 сен. 2014, в 22:03
Поделиться
Ещё вопросы
- 1Копирование файла с устройства Android?
- 0Оператор SELECT с повторяющимися именами таблиц
- 0PHP-функция почты Outlook UTF8
- 1Удалить пунктуацию, сохранить буквы и пробелы — Java Regex
- 1Регулярное выражение для сопоставления и извлечения длинного домена
- 1Ошибка просмотра списка не может быть запущена; принудительное закрытие
- 1Форматирование даты в Gridview
- 1как записать аудио файл в браузере, кроме Recorder.js
- 1Обслуживание Tensorflow: в get_model_status отсутствуют «утилиты»
- 0JQuery 1.7. на не работает должным образом
- 0События в динамическом массиве флажков из базы данных
- 0вложенные контроллеры, родительский доступ и синтаксис controllerAs
- 1Pandas — Python отбрасывает строки, если столбец содержит несколько критериев
- 0Как я могу изменить этот код, чтобы он работал с IE 11?
- 0ВЫБЕРИТЕ пользователей с несколькими условиями И / ИЛИ / В в 1 столбце
- 0База данных mysql drop, которая существует с тем же именем
- 0sort3 не был объявлен в этой области
- 0как импортировать разные методы из разных файлов в другой файл javascript для объектов страницы E2E-тестирование с помощью транспортира
- 1Невозможно заморозить модели Tensorflow в замороженном файле (.pb)
- 0JQuery динамически добавленный текст не будет загружать стиль веб-шрифта
- 1Android — Макет вопроса — Textviews верхний центр и нижний центр
- 0отключить ссылку якоря стоек после отправки запроса на действие
- 1Захват части группы
- 1определить, где на экране произошло событие
- 0Переупорядочить / сгруппировать различные элементы в DOM, чтобы обернуть похожие
- 0Как сделать переменную как вызываемую функцию?
- 1Где хранятся потоковые данные BLOB до фиксации?
- 1Удаление символов ASCII в строке
- 1Maven-Shade-плагин: сделать банку, а мы на войне Проект?
- 1App Engine Connected Android проект Ошибка соединения C2DM
- 0Разбор файла в базе данных MySQL. Индекс строки вне диапазона
- 0Перекрытие контента CSS
- 1Создание комплексного запроса к сайту (общественная транспортная компания) в C #
- 0Как отразить высоту строк для разных строк в одной таблице?
- 1Тестирование аудио файла с использованием C #
- 1Как установить компоненты платформы Android в автономном режиме?
- 0Mysql union не суммирует одинаковые значения
- 0Заголовок API-ключа не отправляется (или не распознается). Angularjs
- 0Импорт XML в mySQL с одинаковым именем атрибута для нескольких уровней узлов
- 0googleChartApiPromise с $ q.all выдает ошибку «тип диаграммы не определен».
- 1Логкат сломан. Нет выхода в затмении или терминале
- 0Ошибка синтаксического анализа внешних данных XML как HTML с JQuery
- 0C ++ функция, которая заполняет массив
- 0Как вводить данные SQL, только если ввод не пустой
- 0Как объявление большого 2D-массива может привести к сбою программы?
- 0Как добавить полосу прокрутки в контейнер перетаскивания с AngularJS?
- 1это лучший способ преобразования типов
- 1вычислить mad () для каждых двух значений информационного кадра
- 0Изменение $ scope внутри контроллера
- 1Почему я должен использовать getContentPane () вместо «this» при установке BoxLayout для JFrame?