Qt does not name a type ошибка

I have default mainwindow class: mainwindow.h and mainwindow.cpp. I also have my own class Sprite: sprite.h and sprite.cpp. I want to create the object of Sprite class in mainwindow.h but I've got an error : "'Sprite' does not name a type'". I included he...

This topic has been deleted. Only users with topic management privileges can see it.

  • I have default mainwindow class: mainwindow.h and mainwindow.cpp. I also have my own class Sprite: sprite.h and sprite.cpp. I want to create the object of Sprite class in mainwindow.h but I’ve got an error : «‘Sprite’ does not name a type‘». I included header file «sprite.h« in mainwindow.h but problem is still there!

    Here is my mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    
    #include <SOME QT HEADERS>
    
    #include "sprite.h"
    
    namespace Game{
        const double version = 0.01;
        const int FPS = 60;
        const int WIDTH = 800;
        const int HEIGHT = 600;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    private:
        QColor mainGameColor;
        Sprite mainSprite;
        void update();
        void paintEvent(QPaintEvent *event);
    };
    

    …and sprite.h

    #ifndef SPRITE_H
    #define SPRITE_H
    
    #include <QObject>
    #include "mainwindow.h"
    
    using namespace std;
    
    class Sprite : public QObject
    {
        Q_OBJECT
    public:
        Sprite(QObject *parent = 0,string file = "default.bmp");
        QImage getSprite();
    signals:
    
    public slots:
    
    private:
        QImage image;
        int x;
        int y;
    };
    
    #endif // SPRITE_H
    

    I will be grateful for any advices!

  • You should remove inclusion of mainwindow.h from sprite.h: you have introduced a circular dependency:

    1. The compiler reads mainwindow and encounters sprite.h include
    2. It proceeds to sprite.h, but finds mainwindow.h include there
    3. It goes back to mainwindow.h, as instructed
    4. And you have a loop ;-)

    [edit: changed explanation to numbered list SGaist]

  • Now my program work nice!Thank you for detailed ansewer:)

  • I’m glad to hear that. Happy coding :-)

  • Thanks Sir

  • Works as charms! right reasoning was required, thanks.

  • @Samarth

    Just as a note for this circular dependency as it can happen quite easy.

    To resolve it often we use a class forward which is simply

    class MyX;

    and we don’t include its header ( MyX header goes to the .cpp instead )

    then in other class in same file

    class Other {
    MyX * someX;
    }

    With the forward class, we are allowed to declare a pointer to that type (MyX) without compiler wanting to see the full header.
    This only works for pointers and references as else it will want to see the full header as the compiler needs
    to check other things when not a pointer.

  • time.h

    Гость


    does not name a type при объявлении указателя на пользовательский класс А.
    Класс А имеет виртуальную функцию и в классе где объявляется указатель на класс А,также используются производные классы от класса А.

    « Последнее редактирование: Июнь 16, 2011, 22:21 от time.h »
    Записан
    time.h

    Гость


    Не я конечно нуб,но все же этот вариант я сто раз проверил.


    Записан
    kambala


    может код покажешь?


    Записан

    Изучением C++ вымощена дорога в Qt.

    UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher

    time.h

    Гость


    Да я думаю не стоит.Много классов.Много кода.


    Записан
    LisandreL

    Птица говорун
    *****
    Offline Offline

    Сообщений: 984

    Надо улыбаться

    Просмотр профиля


    Да я думаю не стоит.Много классов.Много кода.

    Типа угадайте телепатически что у меня не так?
    Всё выше правильно написали — либо хедер не подключен, либо в названии типа опечатка.

    На той строке, где ошибка ctrl+click по названию класса — если никуда не перешли (или перешли, но нетуда), значит точно ошибка в этом.


    Записан
    time.h

    Гость


    Типа угадайте телепатически что у меня не так?

    Без телепатии неплохо справляешся. Смеющийся Проблема похоже заключается в том что название класса совпадает с названием одной из функций QObject.
    Всем спасибо за помощь.

    « Последнее редактирование: Июнь 16, 2011, 22:53 от time.h »
    Записан
    LisandreL

    Птица говорун
    *****
    Offline Offline

    Сообщений: 984

    Надо улыбаться

    Просмотр профиля


    Проблема похоже заключается в том что название класса совпадает с названием одной из функций QObject.

    Могу посоветовать следовать правилам именования в Qt — имена классов с Большой буквы, а имена переменных и функций — с маленькой.


    Записан
    • Home
    • Forum
    • Qt
    • Qt Programming
    • ‘Class’ does not name a type error

    1. 31st January 2011, 17:43


      #1

      Default ‘Class’ does not name a type error

      hi, its probably some silly mistake in c++ but my code is not working, it gives me error.

      here is code

      _time.h

      1. #ifndef _TIME_H

      2. #define _TIME_H

      3. #include <QObject>

      4. #include <QTimer>

      5. {

      6. Q_OBJECT

      7. public:

      8. _Time();

      9. _Time(int sec=0,int min=0,int hour=0);

      10. int hour;

      11. int min;

      12. int sec;

      13. };

      14. #endif // _TIME_H

      To copy to clipboard, switch view to plain text mode 

      _time.cpp

      1. #include "_time.h"

      2. _Time::_Time()

      3. {

      4. hour=0;

      5. min=0;

      6. sec=0;

      7. }

      8. _Time::_Time(int s, int m, int h)

      9. {

      10. if (h > -1)

      11. hour=h;

      12. else

      13. hour=0;

      14. if ((m > -1) && (m<60))

      15. min=m;

      16. else

      17. min=0;

      18. if ((s > -1) && (s<60))

      19. sec=s;

      20. else

      21. sec=0;

      22. }

      To copy to clipboard, switch view to plain text mode 

      main.cpp

      1. #include "_time.h"

      2. _Time t;

      3. int main(int argc, char *argv[])

      4. {

      5. return 0;

      6. }

      To copy to clipboard, switch view to plain text mode 

      i get error:
      _Time does not name a type.

      any suggestions? thanks in advance

      Last edited by naturalpsychic; 31st January 2011 at 18:34.

      Reason: code correction

      Life is like a dream, sometimes it is good and somtimes it is bad, but in the end it is over


    2. 31st January 2011, 17:53


      #2

      Default Re: ‘Class’ does not name a type error

      You are missing a semi colon at your class declaration.


    3. 31st January 2011, 18:04


      #3

      Default Re: ‘Class’ does not name a type error

      thanks for reply but im sorry in actual code there is semi colon (forgot to put in forum)..
      even with semi colon it does not work

      Life is like a dream, sometimes it is good and somtimes it is bad, but in the end it is over


    4. 1st February 2011, 00:32


      #4

      Default Re: ‘Class’ does not name a type error

      naturalpsychic, I have a riddle for you.

      Let us consider following code:

      1. _Time t;

      To copy to clipboard, switch view to plain text mode 

      Which one of those two constructors

      1. 1) _Time();

      2. 2) _Time(int sec=0,int min=0,int hour=0);

      To copy to clipboard, switch view to plain text mode 

      should be called ?

      Do you know the answer ?


    5. 1st February 2011, 03:28


      #5

      Default Re: ‘Class’ does not name a type error

      This exactly what my compiler tells me too.

      1. main.cpp:2: error: call of overloaded ‘_Time()’ is ambiguous

      2. _time.h:12: note: candidates are: _Time::_Time(int, int, int)

      3. _time.h:11: note: _Time::_Time()

      4. main.cpp:3: warning: unused parameter ‘argc’

      5. main.cpp:3: warning: unused parameter ‘argv’

      6. make: *** [main.o] Error 1

      To copy to clipboard, switch view to plain text mode 

      You do not need your no-arguments constructor.

      The difference in error messages aside, from the 2003 C++ Standard:

      17.4.3.2.1 Global names [lib.global.names]

      Certain sets of names and function signatures are always reserved to the implementation:

      * Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.
      * Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace. [165]

      [165] Such names are also reserved in namespace ::std (17.4.3.1).

      So _Time is a bad name.

      Last edited by ChrisW67; 1st February 2011 at 03:37.

      Reason: updated contents


    6. 1st February 2011, 15:58


      #6

      Default Re: ‘Class’ does not name a type error

      thanks for reply

      what i have done now is i changed my ‘_Time’ class name to ‘CMTime’, thanks for the reference,

      also now i have gotten rid of one of constructor now i have got one constructor,

      i still get this error (CMTime does not name a type)

      and if i get rid of
      #ifndef _TIME_H
      #define _TIME_H


      #end _TIME_H
      macro definition i get error for multi declaration of class, i had made sure myself by re-writing class with same functions, but its still doing that

      thanks in advance

      Life is like a dream, sometimes it is good and somtimes it is bad, but in the end it is over


    7. 1st February 2011, 16:19


      #7

      Default Re: ‘Class’ does not name a type error

      please send a minimal compilable example reproducing the error.


    8. 1st February 2011, 16:25


      #8

      Default Re: ‘Class’ does not name a type error

      _time.h

      1. #ifndef _TIME_H

      2. #define _TIME_H

      3. #include <QObject>

      4. #include <QTimer>

      5. class CMTime : public QObject

      6. {

      7. Q_OBJECT

      8. public:

      9. //CMTime();

      10. CMTime(int sec=0,int min=0,int hour=0);

      11. void startTicking();

      12. int getHour();

      13. int getMin();

      14. int getSec();

      15. int getTotalSeconds();

      16. static QString getTime(int h,int m, int s);

      17. private:

      18. int hour;int min;int sec;

      19. signals:

      20. void secondPast(int h,int m,int s);

      21. public slots:

      22. void timeout();

      23. };

      24. #endif // _TIME_H

      To copy to clipboard, switch view to plain text mode 

      _time.cpp

      1. #include "_time.h"

      2. /*CMTime::CMTime()

      3. {

      4.   timer=new QTimer(this);

      5.   hour=0;

      6.   min=0;

      7.   sec=0;

      8.   QObject::connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));

      9. }*/

      10. CMTime::CMTime(int s, int m, int h)

      11. {

      12. if (h > -1)

      13. hour=h;

      14. else

      15. hour=0;

      16. if ((m > -1) && (m<60))

      17. min=m;

      18. else

      19. min=0;

      20. if ((s > -1) && (s<60))

      21. sec=s;

      22. else

      23. sec=0;

      24. QObject::connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));

      25. }

      26. int CMTime::getHour()

      27. {

      28. return hour;

      29. }

      30. int CMTime::getMin()

      31. {

      32. return min;

      33. }

      34. int CMTime::getSec()

      35. {

      36. return sec;

      37. }

      38. void CMTime::timeout()

      39. {

      40. emit secondPast(hour,min,sec);

      41. if (sec++ == 59)

      42. {

      43. sec=0;

      44. if (min++ == 59)

      45. {

      46. min=0;

      47. hour++;

      48. }

      49. }

      50. }

      51. {

      52. QString result=getTime(getHour(),getMin(),getSec());

      53. sec=0;

      54. hour=0;

      55. min=0;

      56. startTicking();

      57. return result;

      58. }

      59. int CMTime::getTotalSeconds()

      60. {

      61. return (sec + (min * 60) + ((hour * 60) * 60));

      62. }

      63. QString CMTime::getTime(int h,int m,int s)

      64. {

      65. QString sStr;QString mStr;QString hStr;

      66. s < 10 ? sStr="0"+QString::number(s):sStr=QString::number(s);

      67. m < 10 ? mStr="0"+QString::number(m):mStr=QString::number(m);

      68. h < 10 ? hStr="0"+QString::number(h):hStr=QString::number(h);

      69. resultTime= hStr+ ":"+mStr+":"+sStr;

      70. return resultTime;

      71. }

      72. void CMTime::startTicking()

      73. {

      74. timer->start(1000);

      75. }

      76. {

      77. timer->stop();

      78. return getTime(getHour(),getMin(),getSec());

      79. }

      To copy to clipboard, switch view to plain text mode 

      _process.h:

      1. #ifndef PROCESS_H

      2. #define PROCESS_H

      3. #include <QThread>

      4. #include "_time.h"

      5. #include <QTreeWidget>

      6. class CMProcess : public QThread

      7. {

      8. Q_OBJECT

      9. public:

      10. CMTime t;//<< here it gives error

      11. };

      12. #endif // PROCESS_H

      To copy to clipboard, switch view to plain text mode 

      Life is like a dream, sometimes it is good and somtimes it is bad, but in the end it is over


    9. 1st February 2011, 16:42


      #9

      Default Re: ‘Class’ does not name a type error

      natural…
      I think you have an error, because I «make» your source code with the changes suggested, and it worked. Maybe you omit making one of the «CM» changes in the class declaration…?
      Hope this helps.

      To late… :-(

      Last edited by arnaiz; 1st February 2011 at 16:47.


    10. 1st February 2011, 16:43


      #10

      Default Re: ‘Class’ does not name a type error

      oh i solved it myself..just in case you guys wondering i changed header macro name to CMTIME_H

      thanks anyways guys

      Life is like a dream, sometimes it is good and somtimes it is bad, but in the end it is over


    Similar Threads

    1. Replies: 1

      Last Post: 26th January 2011, 07:23

    2. Replies: 12

      Last Post: 28th May 2010, 01:07

    3. Replies: 2

      Last Post: 12th May 2010, 18:42

    4. Replies: 3

      Last Post: 27th December 2008, 20:34

    5. Replies: 1

      Last Post: 16th July 2008, 15:01

    Tags for this Thread

    Bookmarks

    Bookmarks


    Posting Permissions

    • You may not post new threads
    • You may not post replies
    • You may not post attachments
    • You may not edit your posts
    •  
    • BB code is On
    • Smilies are On
    • [IMG] code is On
    • [VIDEO] code is On
    • HTML code is Off

    Forum Rules

    Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.

    Hi,

    Trying to compile PgModeler on Win 7, QT 5.3.1 with MinGW 4.8.2. I got around most errors but wondering why getting this error:

    In file included from src/databaseimportform.h:29:0,
                                     from src/mainwindow.h:43,
                                     from src/mainwindow.cpp:19:
    src/databaseimporthelper.h:53:3: error: 'Catalog' does not name a type
         Catalog catalog;
         ^
    In file included from src/sqltoolwidget.h:32:0,
                                     from src/mainwindow.h:44,
                                     from src/mainwindow.cpp:19:
    src/datamanipulationform.h:53:3: error: 'Catalog' does not name a type
         Catalog catalog;
         ^
    In file included from src/mainwindow.h:44:0,
                                     from src/mainwindow.cpp:19:
    src/sqltoolwidget.h:90:32: error: 'Catalog' has not been declared
         static void fillResultsTable(Catalog &catalog, ResultSet &res, QTableWidget *results_tbw, bool store_data=false);
                                                                    ^
    Makefile.Release:38274: recipe for target 'obj/mainwindow.o' failed
    mingw32-make[2]: *** [obj/mainwindow.o] Error 1
    mingw32-make[2]: Leaving directory 'c:/Temp/pgmodeler/pgmodeler-develop/libpgmodeler_ui'
    Makefile:34: recipe for target 'release' failed
    mingw32-make[1]: *** [release] Error 2
    mingw32-make[1]: Leaving directory 'c:/Temp/pgmodeler/pgmodeler-develop/libpgmodeler_ui'
    Makefile:262: recipe for target 'sub-libpgmodeler_ui-make_first-ordered' failed
    mingw32-make: *** [sub-libpgmodeler_ui-make_first-ordered] Error 2
    

    I see the same issue has been mentioned by @yangkwch in issue #463 and indeed, the solution that also works for me is to change the include path of catalog.h in databaseimporthelper.h (and as of 0.8.0 also in datamanipulationform.h) from

    #include "catalog.h"

    to

    #include "../../libpgconnector/src/catalog.h".

    Question: is there any reason why this fix was not put into the GitHub source repository? I don’t mind doing this change every time I compile but not sure why it has not been fixed…

    Родион

    Здравствуйте! 

    Решил сделать взаимодействие с графиком в отдельном файле, чтобы удобно было работать с кнопками и самим графиком, но столкнулся с такой проблемой, что при компиляции появляется ошибка does not name a type. Я поискал в гугле, что по этой проблеме говорят (например, https://stackoverflow.com/questions/2133250/x-does-not-name-a-type-error-in-c), понял, что нужно сместить свой класс, так чтобы он собирался раньше чем MainWindow, но я не понимаю, как это сделать, когда класс MainWindow основной, и при перестановке хедеров в mainwindow.h у меня появляется еще большее количество ошибок. 

    mianwindow.h

    #include <QMainWindow>
    #include <QFont>
    #include <QVector>
    #include <QTimer>
    #include <QtMath>
    #include "oscilloscope.h"
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    public slots:
        void setData(const QVector< double > &keys, const QVector< double > &values);
        void replotGraph();
    
    signals:
    
    private:
        Ui::MainWindow *ui;
        Oscilloscope *scope;
    };

    oscilloscope.h

    #include <mainwindow.h>
    
    #define SIZE_SAMPLE  5000
    #define TIME_UPDATE  10
    
    class Oscilloscope : public QMainWindow
    {
        Q_OBJECT
    
    public:
        Oscilloscope(QWidget *parent = nullptr);
        ~Oscilloscope();
    
        void Updated();
        void setNotifyInterval(int t);
    
        double gaussrand(double m, double sko);
        double sin(double f, double amp, int x);
    
        void setTimeUpdate(int time);
    
    private slots:
        void processing();
    
    signals:
        void notify();
        void setData(const QVector<double> &keys, const QVector<double> &values);
        void replotGraph();
        void setColorPen();
        void setStalyPen();
        void setRandgeAxisX();
        void setRandgeAxisY();
    
    private:
        QTimer *timer;
    
        QVector<double> x, y;
        QVector<double> xSin, ySin;
    
        int timeUpdate;
    };

    Цитата

    Topic starter
    Размещено : 12.02.2022 19:40

    Родион

    Проблема исчезла, когда я родителем у класса Oscilloscope сделал QObject. Правильно ли я понимаю, что сделав в качестве родителя самый базовый класс Qt, я гарантировал, что мой созданный класс будет собираться перед MainWindow?

    ОтветитьЦитата

    Topic starter
    Размещено : 12.02.2022 20:59

    Aveal

    @rodion-2 А можешь проблемный проект скинуть, с ошибкой?

    ОтветитьЦитата

    Размещено : 14.02.2022 09:37

    Родион

    @aveal Могу, но только вечером. Спасибо большое

    ОтветитьЦитата

    Topic starter
    Размещено : 14.02.2022 12:19

    11 ответов

    Я нашел эту проблему на qtcreator 3.4.1 и QT 5.4, когда я заменил, например,

    #include <QTextEdit>
    

    с

    class QTextEdit;
    

    эта проблема исчезла.

    changfeng
    14 июнь 2015, в 12:10

    Поделиться

    У меня была эта проблема, и как Arckaroph сказали:
    проблема заключается в том, что когда мы включаем заголовочный файл в файл исходного кода, и мы используем в нем директиву #ifndef, мы не можем включить его снова в заголовочный файл, чтобы указать тип включенных классов в переменную в источнике файл кода

    пример:

    class1.h содержит Class1
    class2.h содержит Class2
    class2 имеет приватную переменную V с классом 1
    если мы включим class1.h в класс 2. CPP, мы не можем включить его в класс2.h, чтобы дать V тип class1.

    поэтому мы помещаем class2.cpp class2.h перед class1.h
    или мы удаляем class1.h из класса2.cpp

    nabil
    16 авг. 2011, в 12:02

    Поделиться

    В abc.cpp убедитесь, что вы включили xyz.h, прежде чем включать abc.h.

    Понятия не имею, почему замена этих двух сторон будет иметь значение, но это было для меня.

    Steve
    09 фев. 2011, в 19:10

    Поделиться

    Я считаю, что вы объявляете что-то типа XYZ, например

    XYZ foo;
    

    Проблема XYZ еще не определена.

    Вот моя проблема и мой вывод. Как вы думаете?

    Моя проблема в том, что у меня класс ABC и класс XYZ. Класс ABC имеет член, который объявлен как тип XYZ. Класс XYZ имеет член, который объявлен как тип ABC. Компилятор не знает, что такое XYZ-тип, потому что он еще не определил его. Поэтому указанная ошибка: «XYZ» не называет тип.

    Пример кода:

    class ABC{
    private:
        XYZ *xyz;   //XYZ is not defined yet
    };
    
    class XYZ{
    private:
        ABC *abc;   //ABC is defined above
    };
    

    Arckaroph
    06 нояб. 2010, в 04:56

    Поделиться

    Получаете ли вы ошибку из компилятора или IDE (как подчеркнуто подчеркивание)? Я столкнулся с этим в Qt Creator 1.2.9, и я думаю, что это ошибка в среде IDE.

    rpg
    15 сен. 2009, в 15:22

    Поделиться

    в недавнем проекте QT, где я только что установил последний QT (3/2011), я вылечил три из них, которые останавливали мою сборку, добавив это…

    #include <sys/types.h>
    

    … до включения файла заголовка, который выдавал ошибки. Так оно и было.

    Я не знаю, почему они распространяли бы что-то, что имело бы такие проблемы, возможно, в других типах систем. В любом случае он включен в нечто другое, но не в моем случае. Надежда, которая помогает кому-то.

    fyngyrz
    31 март 2011, в 05:49

    Поделиться

    Я нашел решение для себя.
    Скажем, у меня есть класс А и класс Б.
    «A.h» включает «B.h» и имеет экземпляр B как участника.
    «B.h» включает «A.h» и имеет экземпляр члена A.
    Компилятор дает мне ошибку в «B.h» в строке кода, где объявлен член класса A:

    "A doesn't name type"
    

    Что я делаю в «A.h» , я удаляю #include «B.h» и помещаю #include «B.h» в «A.cpp». И перед объявлением класса я пишу класс B;

    ...
    // #include "B.h"
    class B;
    
    class A
    {
    ... 
    B m_b;
    };
    ...
    

    Работал для меня, удачи!

    Vadixem
    15 фев. 2018, в 17:52

    Поделиться

    В моем случае я не использовал пространство имен, в котором был определен класс. Содержимое заголовка содержалось в пространстве имен, но в исходном файле отсутствовала директива using namespace.

    .h:

    namespace mynamespace {
        class MyClass : public QWidget
        { 
            ...
        }
    }
    

    .cpp:

    using namespace mynamespace
    
    MyClass::MyClass(QWidget *parent) : QWidget(parent)
    {
    }
    

    NuclearPeon
    18 июль 2016, в 01:21

    Поделиться

    Мне приходят две возможности:
    1. Возможно, у вас есть SLOT вместо SIGNAL при вызове connect().
    2. Иногда это помогает сделать бесплатное редактирование файла .PRO(например, вставить и удалить пробел), чтобы QMake запускался и файлы .moc генерировались.

    TonyK
    09 фев. 2011, в 19:58

    Поделиться

    Помогает ли # включить соответствующий заголовочный файл?

    Dirk Eddelbuettel
    14 сен. 2009, в 15:38

    Поделиться

    Если вы используете шаблоны, вам нужно предшествовать имени класса с «typename», чтобы компилятор мог распознать его как тип…

    template <typename t> //...
    

    aviraldg
    14 сен. 2009, в 14:23

    Поделиться

    Ещё вопросы

    • 1Одиночная JSP с другим классом действия
    • 1Как хранить ключ шифрования .NET
    • 0Paypal вернуть динамическую ссылку?
    • 1Вне контроля ListView
    • 0Javascript — передача параметра в функцию, которая вызывает другую функцию
    • 1Уровень доступа к базе данных ASP.NET MVC
    • 0Есть ли способы повторно использовать подзапрос в синтаксисе SELECT FROM (запрос) в части JOIN?
    • 1Как утверждать, что путь выполнения не выполняется более одного раза в Java?
    • 0Сбой перегруженной функции оператора
    • 1WELD-001318 Не удается разрешить неоднозначную зависимость между. , , в GlassFish 4
    • 0Как связать php и MS SQL в LAMP
    • 1Несоответствие количества транзакций с многоуровневыми транзакциями
    • 1Java: Как добавить несколько внешних библиотек в makefile?
    • 0OpenCV VideoCapture :: set () возвращает false, но успешно
    • 1Изменить шаблон панели приложения и селектора длинных списков из Viewmodel
    • 0Как сохранить значение переменной Python в Telegram в локальной базе данных?
    • 1Подключение приложения Android к HTTP-серверу
    • 0отключить выбор значения после выбора значения из одного тега выбора
    • 0MySQL сервер ушел на ОБНОВЛЕНИЕ (Огромный QUERY, около 85 МБ), используя mysli PHP
    • 0Тип элемента, хранящегося в матовой структуре OpenCV
    • 0Ошибка установки Magento 2: класс «Magento Framework Autoload AutoloaderRegistry» не найден
    • 0Проверьте, генерируется ли сообщение журнала, используя Boost.Log
    • 0Как использовать Zend Pagination
    • 1Создание пользовательской аннотации с использованием Spring, который поддерживает гибкую подпись метода
    • 1связь между закрытым ключом и подписанным сертификатом в хранилище ключей
    • 0AngularJS — двойные фигурные скобки, вызывающие синтаксическую ошибку
    • 1Проблема с использованием Runnable + Handler.postDelayed для растровой анимации маркера
    • 1Найти первый пустой слот в массиве объектов
    • 0Angularjs выбирает «поддельную» модель обновления
    • 0Как установить идентификатор и имя с автозаполнением
    • 0Как заставить скрытый элемент скользить вниз, не затрагивая другие элементы в той же строке
    • 1Загрузить файлы из динамического просмотра
    • 0AngularJS: Как установить активный класс для элемента списка при нажатии? Тернарный метод
    • 0Ежемесячный повтор с PHP
    • 0Как выполнить многобайтовый безопасный запрос SQL REGEXP?
    • 0Выберите элемент с помощью getElementsByTagName
    • 1Панды для Loop Optimization
    • 0черное цветное устройство iphone мигает в моем приложении jqery для мобильных телефонов
    • 0Вызов функции из сервисного органа AngularJS
    • 1Измените размер изображения так, чтобы оно соответствовало сетке JPanel
    • 0IE условные комментарии ‘и’?
    • 0Как я могу получить свой Angular $ http запрос на возврат ответа? Я пробовал функции обратного вызова и обещания
    • 0функции isupper (), islower (), toupper (), tolower () не работают в c ++
    • 1android OAuth вопрос, как отправить запрос на запрос токена
    • 1Измените чувствительность масштабирования в ткани.js
    • 0PDO Подготовленные заявления и логические значения
    • 0Как отобразить новое изображение / окно при переходе на другое изображение / ссылку
    • 1Vue.js добавляет класс при обновлении вычисленного значения
    • 0Программа «Бродкаст»
    • 1Извлечение данных из дерева

    Fix «does not name a type» without forward declaration

    Pages: 12

    I’ve got a base class, and five classes that inherit from it using public BaseClass. In each derived class’s header, I #include baseclass.h .

    In a different header file, I #include all five of these classes (but not the base class), and declare a pointer to one of each. The problem is, I only get the

    'class' does not name a type

    error for one of these classes. I’m positive I spelled it right, so that’s not the problem. I also tried forward declaration (which gave me more errors). What could the problem be?

    Last edited on

    Do you have header guards in your headers?

    If you don’t, and don’t know what they are, just put

    #pragma once

    at the beginning of all of your header files.

    I do have header guards.
    I’ve also tried declaring the pointer this way:
    BaseClass* instance;
    thinking that polymorphism compiles. Then g++ decides that the inheriting class is an int*, which it is most definitely not.

    Last edited on

    Cna you please show the header for problem file.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // baseclass.h
    
    #ifndef BASECLASS_H
    #define BASECLASS_H
    
    #include // some Qt headers
    
    class BaseClass: public /* Qt object */ {
        public:
            BaseClass(int x, int y);
            // methods
        protected:
            // members
    };
    
    #endif 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // class.h
    
    #ifndef CLASS_H
    #define CLASS_H
    
    #include "baseclass.h"
    
    class Class: public BaseClass {
        public:
            Class(int x, int y);
    };
    
    #endif 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // class.cpp
    
    #include "class.h"
    
    Class::Class(int x, int y)
        : BaseClass(x, y)
    {
        // do stuff
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // main.h
    
    #ifndef MAIN_H
    #define MAIN_H
    
    #include // more Qt headers
    #include "class.h" // and 4 other classes
    
    class Main {
        public:
            // methods
        private:
            //members
            Class* classPtr;  // <--- The error: 'Class' does not name a type
    };
    
    #endif 

    Last edited on

    Why are you defining the class Class in both main.h and class.h?

    Check your header guards, if there is two same header guards, it will prevent your second class from including.
    And I hope that your class in main does not have the same name as problem class like you showed.

    Peter: That was a mistake; I’ve corrected it now.

    The five inheriting classes each have their own header guard (i.e., class1, class2, etc.). I’ve made sure of this.

    Last edited on

    If you inherit from QObject, shouldn’t you use the Q_OBJECT macro to get the moc behave?

    Yes, I do use that macro. I just didn’t find it relevant to the error I’m experiencing.

    It’s impossible to know what the problem is without seeing real code.

    It’s for an assignment, and I am not allowed to publicly post said real code. Could you private message me your email address?

    Last edited on

    A great read, thanks for the link.
    Since my main.h only uses a pointer, I went ahead and forward declared the class (whose parent is BaseClass, and thus includes baseclass.h) in main.h. This does not resolve the error.

    Last edited on

    Start by stripping out all unnecesary things (actual uses of classes, make function definition empty, remove inheritance of QTobject) while checking if problem persist. Then rename all classes, check problem again and post it. That way we will see your problem and you will not show any actual code.

    It took longer than I expected to whittle the code down.

    @ne555, L B: I know for the sake of legibility, it’s bad practice to have multiple classes/methods/members/etc with the same name (especially main) — and I do NOT do this in my program (or any of them) — but is there anything stopping me from creating a class Main?

    @trojansdestroy: There is nothing wrong with a class named Main, in this case it is a design pattern in C++ ;)
    I was linking @ne555 to an example of the design pattern being used in one of my other projects.

    Last edited on

    Pages: 12

    Понравилась статья? Поделить с друзьями:
  • Pyttsx3 как изменить голос
  • Pyttsx3 init error
  • Qt creator ошибка при запуске приложения 0xc000005
  • Pythonpath как изменить
  • Qt creator ошибка qmake