Меню

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

Так выглядит declaration класса:

class Player {
private:
  int health;
  int strength;
  int agility;
public:
  void move();
  void attackMonster();
  void getTreasure();
};

Т.е. это просто описание интерфейса класса.

Понятное дело, что оно должно присутствовать в файлах ОДИН раз, но в каждом cpp, где этот класс используется. Поэтому определение класса выносят в h-шник.

Если же у Вас определение класса есть и в h-файле, и во включающем его cpp-файле, то естественно, что компилятор заругается. Поэтому если Вы собираетесь использовать этот класс в нескольких файлах, то разумно в cpp-файл вынести исключительно реализацию функций-членов (т.е. function definition). Т.е. в cpp-файле будет:

#include <player.h> // наш h-файл
void Player::move
{
// код ф-ции
}
void Player::attackMonster()
{
// код ф-ции
}
void Player::getTreasure()
{
// код ф-ции
}

Шаблонные классы вместе со своими ф-циями удобно целиком описывать в h-нике. Все равно они потом будут подставляться по месту использования компилятором.

Ну, и не забывайте в своих h-файлах делать блоки защиты от повторного включения:

#ifndef MY_SYMBOL_H
#define MY_SYMBOL_H
// здесь идет собственно тело h-ника
#endif //MY_SYMBOL_H

1 / 1 / 3

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

Сообщений: 169

1

06.11.2013, 23:23. Показов 8113. Ответов 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



The problem is that in MyClass.h you define a class MySecondClass as an empty class. When you the define your class in MyClass.cpp you give a different definition, which contains some new members. This infringes the One Definition Rule (ODR).

Solution 1

remove {} in the header. This will tell the compiler that you declare that such a class exists but that it will be defined later. Your code would compile. Unfortunately if you’d include the header in other cpp, these could make only a very very limited use of MySecondClass.

Solution 2

define in the header the class with all its members (but without providing the implementation of the member functions:the signature is sufficient). This would allow the class to be used in whichever cpp that
would include it:

// MyClass.h
#pragma once
namespace MyNamespace {
    class MySecondClass {
    public:
        void print(const char* msg);
    };
}

You’d then define the members of the class in its cpp in the appropriate namespace:

// MyClass.cpp
#include <iostream>
#include "MyClass.h"

using namespace std;

namespace MyNamespace {
    // member functions
    void MySecondClass::print(const char* msg)
    {
        cout << msg << endl;
    }
}

Remark: the include sequence in the cpp should first include the standard library headers, then only your own headers. It makes no difference in your simple example, but better get used the good practices immediately.

The problem is that in MyClass.h you define a class MySecondClass as an empty class. When you the define your class in MyClass.cpp you give a different definition, which contains some new members. This infringes the One Definition Rule (ODR).

Solution 1

remove {} in the header. This will tell the compiler that you declare that such a class exists but that it will be defined later. Your code would compile. Unfortunately if you’d include the header in other cpp, these could make only a very very limited use of MySecondClass.

Solution 2

define in the header the class with all its members (but without providing the implementation of the member functions:the signature is sufficient). This would allow the class to be used in whichever cpp that
would include it:

// MyClass.h
#pragma once
namespace MyNamespace {
    class MySecondClass {
    public:
        void print(const char* msg);
    };
}

You’d then define the members of the class in its cpp in the appropriate namespace:

// MyClass.cpp
#include <iostream>
#include "MyClass.h"

using namespace std;

namespace MyNamespace {
    // member functions
    void MySecondClass::print(const char* msg)
    {
        cout << msg << endl;
    }
}

Remark: the include sequence in the cpp should first include the standard library headers, then only your own headers. It makes no difference in your simple example, but better get used the good practices immediately.

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

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,6177 gold badges52 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.6k13 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

You might also get this error if you have multiple branches of your project on your development station and use a symlink to point to one of them.

Let’s suppose you have two different branches of your solution called Project1 and Project2 and you let a symlink called Project point to either Project1 or Project2.

The idea is that you could switch between branches and the project would always appear to be Project to your application and possibly some other tools that expect it there.

Disclaimer: yes, version control can switch between branches, but this way you will not have to rebuild the whole application every single time you switch branches. Besides both branches can still be under version control.

Okay, so opening Project would open either Project1 or Project2 depending on the symlink. The symlink could be removed/created by some simple mklink_1 and mklink_2 like script files.

Here comes the pitfall:

If you don’t pay attention and directly open the solution at location 1 or 2 directly (instead of following the directory symlink with Visual Studio), the pre-processor might be tricked into mixing Project1MyHeader.h (or MyProject2MyHeader.h) with MyProjectMyHeader.h!

Even those are technically the same file, the preprocessor doesn’t know about the symlink. So here the #pragma once would not save you!

You might also get this error if you have multiple branches of your project on your development station and use a symlink to point to one of them.

Let’s suppose you have two different branches of your solution called Project1 and Project2 and you let a symlink called Project point to either Project1 or Project2.

The idea is that you could switch between branches and the project would always appear to be Project to your application and possibly some other tools that expect it there.

Disclaimer: yes, version control can switch between branches, but this way you will not have to rebuild the whole application every single time you switch branches. Besides both branches can still be under version control.

Okay, so opening Project would open either Project1 or Project2 depending on the symlink. The symlink could be removed/created by some simple mklink_1 and mklink_2 like script files.

Here comes the pitfall:

If you don’t pay attention and directly open the solution at location 1 or 2 directly (instead of following the directory symlink with Visual Studio), the pre-processor might be tricked into mixing Project1MyHeader.h (or MyProject2MyHeader.h) with MyProjectMyHeader.h!

Even those are technically the same file, the preprocessor doesn’t know about the symlink. So here the #pragma once would not save you!

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

1 / 1 / 3

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

Сообщений: 169

1

06.11.2013, 23:23. Показов 8097. Ответов 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

    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,0836 ]   [ 16 queries used ]   [ Generated: 30.01.23, 01:14 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 тебя бы не спас!

                        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,0439 ]   [ 16 queries used ]   [ Generated: 30.01.23, 19:25 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Не удается установить Phalanger 4.0
                                          • 1Изменить комплексную ул. Для плавания в пандах.
                                          • 1Такая же раскладка выглядит по-разному на Samsung Galaxy Tab
                                          • 0Как ссылаться на другую таблицу по идентификатору?
                                          • 1Воспроизведение кодированного пользовательского интерфейса из консольного проекта при воспроизведении. Функция Initialize () вызывает исключение System.TypeInitialization.
                                          • 1Проблема с кодированием апостопа в JavaScript в рельсах 5
                                          • 0Ошибка обновления обновления Concrete5
                                          • 1Javascript змея игра яблочный респаун
                                          • 0TypeError: Невозможно установить свойство » из неопределенного
                                          • 0MySQL / MariaDB установки значений с INTO внутри курсора имеют неправильные итерации
                                          • 0Как передать единственный параметр в директиву настраиваемого атрибута?
                                          • 1Запуск приложения для Android в Eclipse
                                          • 0Переменная Php в строку запроса XML
                                          • 1Weblogic — веб-приложение в основном приложении
                                          • 1Почему python2 показывает r (Raw escaped), а python3 — нет?
                                          • 1Добавление элементов в список
                                          • 1Класс Process Stream не поддерживает запись
                                          • 0Как применить AngularJS нг-класса на основе условия?
                                          • 1Android SENSOR_PROXIMITY / SENSOR_LIGHT на Motorola Droid (Milestone)
                                          • 0JQuery Mobile — все, что содержится в новых Div
                                          • 0проблема при установке старой библиотеки 2005 BOOST
                                          • 0Как выбрать неагрегированные столбцы в запросе с предложением GROUP BY, которое функционально не зависит от столбцов в предложении GROUP BY?
                                          • 0jquery высота / ширина, если оператор не работает
                                          • 1Фреймворк Qt похож на Titanium?
                                          • 1Вкладки Android — избегайте воссоздания действий при нажатии на вкладки
                                          • 0JSONP Query и AngularJS
                                          • 0Один контроллер и более одного шаблона с ui-роутером?
                                          • 0Sql — исключить значение 0
                                          • 1LINQ Multiple GroupBy Query Выполнение в несколько раз медленнее, чем T-SQL
                                          • 0Разделить QString на — (тире) символ, доступ к элементу списка
                                          • 0Как я могу создать короткое перенаправление домена на YouTube в htaccess?
                                          • 0Отправить переменную JS в PHP по нажатию
                                          • 1Следующая и предыдущая кнопки в массиве циклически перебирают массив слишком много раз при каждом нажатии (более одного раза)
                                          • 0Как получить часы и минуты в этом коде MySQL PHP
                                          • 0Вызов переменной javascript внутри кода ac #
                                          • 0Angularjs ng-repeat повторять в зависимости от переменной в контроллере
                                          • 0jQuery validate плагин — только успешно показывать изображение «галочка», иначе при ошибке показывать «крестик» изображение
                                          • 1Быстрый способ создать мульти-массив с тем же размером другого без итерации?
                                          • 0Угловое наследование JS-контроллера
                                          • 1Ошибка приведения объекта [] к строке []
                                          • 1Регулярное выражение для сопоставления 3 или 4 выражений части с разделителями пробела и пробела
                                          • 1питон — дубликат лототона на экстракторе
                                          • 1Объединение / Пересечение двух наборов без изменения одного из наборов
                                          • 1Как получить количество всех вариантов (скажем, из опроса) в виде столбцов
                                          • 0Как мне удалить виджеты в jQuery?
                                          • 0соединить MySQL с Firebase
                                          • 0Автозаполнение jQuery UI плагин с JSP и сервлетов не работает
                                          • 1как сказать egit игнорировать некоторые типы файлов
                                          • 0PHP / MySQL n-ая строка с DATE_SUB и т. Д.
                                          • 0Затем Angularjs метод запроса $ http

                                          Сообщество Overcoder

                                          0 0 голоса
                                          Рейтинг статьи
                                          Подписаться
                                          Уведомить о
                                          guest

                                          0 комментариев
                                          Старые
                                          Новые Популярные
                                          Межтекстовые Отзывы
                                          Посмотреть все комментарии

                                          А вот еще интересные материалы:

                                        • Яшка сломя голову остановился исправьте ошибки
                                        • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
                                        • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
                                        • Перед нами известный ученый замечательный человек одиозная личность ошибка
                                        • Перенос слова является ли орфографической ошибкой