Переопределение типа класс ошибка

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: '...

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's user avatar

meJustAndrew

5,6677 gold badges53 silver badges71 bronze badges

asked Sep 7, 2014 at 19:01

user3164272's user avatar

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

Ashot's user avatar

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

empty's user avatar

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-MVP's user avatar

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's user avatar

Yun

2,8346 gold badges8 silver badges28 bronze badges

answered Sep 15, 2021 at 5:48

Chaohsiung  Huang's user avatar

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 2 days ago

Mike Garrison's user avatar

New contributor

Mike Garrison is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

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's user avatar

meJustAndrew

5,6677 gold badges53 silver badges71 bronze badges

asked Sep 7, 2014 at 19:01

user3164272's user avatar

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

Ashot's user avatar

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

empty's user avatar

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-MVP's user avatar

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's user avatar

Yun

2,8346 gold badges8 silver badges28 bronze badges

answered Sep 15, 2021 at 5:48

Chaohsiung  Huang's user avatar

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 2 days ago

Mike Garrison's user avatar

New contributor

Mike Garrison is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

1 / 1 / 3

Регистрация: 28.01.2013

Сообщений: 169

1

06.11.2013, 23:23. Показов 8248. Ответов 3


Как я понял, ошибка «переопределение типа «class»» означает что класс уже был где-то объявлен, однако у меня он вроде нигде больше не объявлен. Вот снизу скрин и кину проект(потому-что 11 файлов и расписывать что тут где как-то неудобно)

Миниатюры

Переопределение типа "class"
 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



I.M.

574 / 557 / 47

Регистрация: 16.12.2011

Сообщений: 1,389

06.11.2013, 23:59

2

C++
1
#pragma once

первой строкой каждого *.h файла



1



ququ_smile

1 / 1 / 3

Регистрация: 28.01.2013

Сообщений: 169

07.11.2013, 00:08

 [ТС]

3

Цитата
Сообщение от I.M.
Посмотреть сообщение

C++
1
#pragma once

первой строкой каждого *.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), препроцессор может быть обманут в смешивании Project1MyHeader.h (или же MyProject2MyHeader.h) с MyProjectMyHeader.h!

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

0

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    переопределение типа «class»
    , чушь какая-то…

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    20.06.09, 11:12

      Вот код:

      ExpandedWrap disabled

        #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



      Сообщ.
      #2

      ,
      20.06.09, 11:16

        Senior Member

        ****

        Рейтинг (т): 24

        а компилятор так и пишет сообщения на русском?
        скорее всего он имеет в виду — что Settings уже объявлен


        Flex Ferrum



        Сообщ.
        #3

        ,
        20.06.09, 11:19

          Цитата miksayer @ 20.06.09, 11:12

          Компилятор(VC++ 2008) ругается на объявление класса:

          концовку файла pugixml покажи, плз. :)


          kanes



          Сообщ.
          #4

          ,
          20.06.09, 11:20

            Цитата Twilight @ 20.06.09, 11:16

            а компилятор так и пишет сообщения на русском?

            Может и на руском писать в русской студии


            miksayer



            Сообщ.
            #5

            ,
            20.06.09, 11:21

              концовка pugixml.hpp:

              ExpandedWrap disabled

                    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



              Сообщ.
              #6

              ,
              20.06.09, 11:25

                miksayer, запяточие перед #endif поставь. :)


                miksayer



                Сообщ.
                #7

                ,
                20.06.09, 11:29

                  блин, сколько раз уже на эти грабли наступал:

                  ExpandedWrap disabled

                    #ifndef SETTINGS_INCLUDED

                    #define SETTINGS_INCLUDED

                    ….

                    #endif

                  отсюда и эта ошибка
                  всем спасибо, вопрос решен

                  Добавлено 20.06.09, 11:30
                  Flex Ferrum, да не в этом проблема, как оказалось :)

                  Добавлено 20.06.09, 11:30
                  т.е. я включал Settings.h в несколько файлов и такая вот фигня получилась


                  Flex Ferrum



                  Сообщ.
                  #8

                  ,
                  20.06.09, 11:51

                    Цитата miksayer @ 20.06.09, 11:29

                    Flex Ferrum, да не в этом проблема, как оказалось :)

                    И в этом тоже, я думаю.


                    Alexandoros



                    Сообщ.
                    #9

                    ,
                    22.06.09, 09:56

                      Цитата miksayer @ 20.06.09, 11:12

                      Компилятор(VC++ 2008) ругается на объявление класса:

                      Цитата

                      d:моеprogrammingviewerviewersrcsettings.h(5) : error C2011: Settings: переопределение типа «class»

                      Что это значит? и что делать?

                      Цитата

                      Compiler Error C2011
                      Error Message
                      ‘identifier’ : ‘type’ type redefinition
                      The identifier was already defined as type. You may also get C2011 if you import a type library more than once into the same file.

                      Выводы делай сам.

                      Еще есть #pragma once.

                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                      0 пользователей:

                      • Предыдущая тема
                      • C/C++: Общие вопросы
                      • Следующая тема

                      Рейтинг@Mail.ru

                      [ Script execution time: 0,0710 ]   [ 16 queries used ]   [ Generated: 12.02.23, 06:11 GMT ]  

                      Один из файлов заголовков выглядит следующим образом:

                      #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

                      Поделиться

                      Ещё вопросы

                      • 0Включить PHP-файл в шаблон TemplaVoilà через TypoScript
                      • 0дата форматирования от контроллера не получает ожидаемый результат
                      • 0свойство переполнения для элементов с абсолютным позиционированием
                      • 1UserError сработал со значением 0
                      • 0PrezentDoctrineTranshableBundle без резервной локали
                      • 0Мерцание в GDI независимо от использования памяти DC и BitBlit
                      • 0Вычисление двумерного массива пикселей с использованием CUDA, объявление правильных размеров сетки и блоков
                      • 1Невозможно разделить изображение с помощью Python
                      • 1Использование классов в цикле for в node.js
                      • 0mod_rewrite добавление косой черты
                      • 1Добавление ключей от dict к заголовкам столбцов в существующем фрейме данных Pandas
                      • 0Определение массива C / C ++
                      • 0Обработка формы с использованием jQuery
                      • 1Как повернуть маркер в рельсах, используя gmaps4rails?
                      • 0Как отключить jQuery Datepicker из MySQL значение / содержание
                      • 0mysql FUNCTION stores.ST_Intersects не существует
                      • 1Кто-нибудь знает, почему я получаю эту ошибку при попытке загрузить фрейм данных в таблицу sybase? [sql алхимия]
                      • 0Угловой счетчик с лимитом и фильтром
                      • 1Привязать несколько числовых текстовых полей в Vue.js
                      • 1Извлеките определенные страницы PDF и сохраните их с помощью Python
                      • 0PHP: Как заполнить массив датами (Ymd) в качестве ключей
                      • 1Как удалить пакет, установленный с помощью URL-адреса проекта git?
                      • 1Antlr: несоответствующий ввод начальный ожидающий идентификатор
                      • 1Вычислить несколько входных данных маски Yii2 с несколькими идентификаторами
                      • 0Как мне вернуть текст выше и ниже моего изображения?
                      • 1Есть ли способ узнать, когда данные вставляются и обновляются в базе данных Firebase?
                      • 0Разработка конвертера Word в PDF с нуля без использования сторонних инструментов
                      • 1DatagramPacket getData vs getLength
                      • 1Как проверить в KeyListener, что Ctrl был выпущен?
                      • 0STRICT MODE -> Изменена структура контроллера, получая «ключ не определен» в цикле For In
                      • 1Получение нескольких сообщений об ошибках с моим скриптом Python
                      • 0затронутые строки в postgres с CodeIgniter
                      • 1Далее Js & Babel вызывает бесконечный цикл
                      • 0Получение контейнера в качестве аргумента шаблона
                      • 0Как мне прочитать ответ POST, используя angularjs?
                      • 1Разобрать XML, содержащий пространство имен, используя JSTL
                      • 1Почему я не могу включить символ «£» в мою психопию.TualStim?
                      • 1Стоп / Перезапуск GLib.Timeout.Add ();
                      • 1отправить значения TextBox из FormB в DataGridView в FormA
                      • 0AngularJS будет повторять и выбирать управление обновлением всех экземпляров
                      • 0Фильтр должен отображать группу по умолчанию
                      • 1Скрыть кнопку в зависимости от состояния с помощью атрибутов
                      • 1как скачать mnist в тензорFlow v1.9
                      • 1C # строки и VARCHAR и NVARCHAR
                      • 1Невозможно получить открытые сеансы, кроме текущего клиента, в веб-сокете Java.
                      • 0Как отформатировать сообщение электронной почты, которое говорит пользователям Outlook «просматривать в HTML» при просмотре в текстовом режиме?
                      • 0Я не могу заставить мою программу читать мой файл в функции
                      • 0найти несколько похожих файлов
                      • 1Regex.Заменить только часть регулярных выражений
                      • 1Как динамически создать DataTemplate и назначить ему StackPanel?

                      Сообщество Overcoder

                      • Remove From My Forums
                      • Вопрос

                      • Здравствуйте, такой вопрос: есть два файла:

                        1 файл:

                        #include»iostream»
                        class base{
                        public:
                        int i;
                        };
                        void test(base ob){

                        std::cout<<«h»<<(ob.i=9);
                        }

                        2 файл:

                        #include»iostream»
                        using namespace std;
                        class base{};
                        void test(base ob);
                        int main(){
                        base ob;
                        test(ob);

                        system(«pause»);
                        return 0;
                        }

                        При запуске программы выходит: h9. Соответственно два вопроса:

                        1. Почему не было ошибки компоновки (переопределение типа)?

                        2. Как удалось присвоить 9 члену «i», если в реализации для второго файла класс base вовсе такого члена не имеет?

                        И вот ещё что примечательно: если в реализации base для второго файла создать член данных  (не важно как обозвать о главное чтобы тоже int) то при выполнении вылетает ошибка.

                        Спасибо!

                        • Изменено

                          13 апреля 2015 г. 22:44

                      Ответы

                      • Здравствуйте. Во втором файле Вы определили другой класс (переопределения типа нет, т.к. файлы cpp компилируются независимо). В этом легко убедится, вычислив размер объекта ob в функциях main и test:

                        // файл 1
                        class base
                        {
                        public:
                        	int i;
                        };
                        
                        void test(base ob)
                        {
                        	cout << __FUNCTION__ << ": " << sizeof(ob) << endl;
                        	cout << "h" << (ob.i = 9) << endl;
                        }
                        
                        // файл 2
                        class base
                        {
                        };
                        
                        void test(base ob);
                        
                        void main()
                        {
                        	base ob;
                        	cout << __FUNCTION__ << ": " << sizeof(ob) << endl;
                        	test(ob);
                        }

                        Далее, код функции test создан на основе первого определения класса и работает в уверенности, что поле i существует. Фактически же выполнение данной функции приводит к «порче» информации в стеке, т.к. test получила копию объекта второго
                        класса (у которого поля i нет). Сделайте параметром test ссылку на base и получите ошибку времени выполнения.


                        Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

                        • Помечено в качестве ответа
                          Леонтий Хачуев
                          14 апреля 2015 г. 11:33

                      Like this post? Please share to your friends:
                    • Переоклейка вина желатином как исправить
                    • Перекошена балконная пластиковая дверь как исправить
                    • Переносица носа как изменить
                    • Перекошен таз как исправить
                    • Перенос слова это орфографическая ошибка или пунктуационная