Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Forward Declaration error
Forum Updated to NodeBB v4.3 + New Features

Forward Declaration error

Scheduled Pinned Locked Moved General and Desktop
26 Posts 4 Posters 20.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    pragati
    wrote on last edited by
    #1

    Hi All,

    I am continuously getting an error no matter how I tried. It says:

    /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:-1: In constructor 'DMM::DMMMenu::DMMMenu(QWidget*)':

    1. /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:9: error: invalid use of incomplete type 'struct DMM::Ui::DMMMenu'
      2./home/pragati/MultiFuncTester/Components/DMM/Build/../Include/DMM.h:11: error: forward declaration of 'struct DMM::Ui::DMMMenu'

    Here is my DMM.h

    @

    #ifndef DMM_H
    #define DMM_H
    #include <QtGui>
    #include <QWidget>

    namespace DMM {

    namespace Ui {

    class DMMMenu;

    }

    class DMMMenu: public QWidget
    {
    Q_OBJECT

    public:

    explicit DMMMenu(QWidget *parent = 0);
    ~DMMMenu();

    private:

    Ui::DMMMenu *ui;
    

    };

    }

    #endif // DMM_H
    @

    Here is my DMM.cpp

    @

    include <../Include/DMM.h>

    include <ui_DMM.h>

    namespace DMM {

    DMMMenu::DMMMenu(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DMMMenu)
    {
    ui->setupUi(this);
    }

    }

    @

    And this is the DMM_ui.h

    @

    /********************************************************************************
    ** Form generated from reading UI file 'DMM.ui'
    **
    ** Created: Fri May 18 10:47:28 2012
    ** by: Qt User Interface Compiler version 4.8.0
    **
    ** WARNING! All changes made in this file will be lost when recompiling UI file!
    ********************************************************************************/

    #ifndef UI_DMM_H
    #define UI_DMM_H

    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QHeaderView>
    #include <QtGui/QPushButton>
    #include <QtGui/QWidget>

    QT_BEGIN_NAMESPACE

    class Ui_DMM
    {
    public:
    QPushButton *pushButton;
    QPushButton *pushButton_2;

    void setupUi(QWidget *DMM)
    {
        if (DMM->objectName().isEmpty())
            DMM->setObjectName(QString::fromUtf8("DMM"));
        DMM->resize(360, 204);
        QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);
        sizePolicy.setHeightForWidth(DMM->sizePolicy().hasHeightForWidth());
        DMM->setSizePolicy(sizePolicy);
        pushButton = new QPushButton(DMM);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        pushButton->setGeometry(QRect(50, 40, 97, 27));
        pushButton_2 = new QPushButton(DMM);
        pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
        pushButton_2->setGeometry(QRect(190, 40, 97, 27));
    
        retranslateUi(DMM);
    
        QMetaObject::connectSlotsByName(DMM);
    } // setupUi
    
    void retranslateUi(QWidget *DMM)
    {
        DMM->setWindowTitle(QApplication::translate("DMM", "Form", 0, QApplication::UnicodeUTF8));
        pushButton->setText(QApplication::translate("DMM", "PushButton", 0, QApplication::UnicodeUTF8));
        pushButton_2->setText(QApplication::translate("DMM", "PushButton", 0, QApplication::UnicodeUTF8));
    } // retranslateUi
    

    };

    namespace Ui {
    class DMMMenu: public Ui_DMM {};
    } // namespace Ui

    QT_END_NAMESPACE

    #endif // UI_DMM_H
    @

    Please help me in this.....Thanks in advance

    1 Reply Last reply
    0
    • JohanSoloJ Offline
      JohanSoloJ Offline
      JohanSolo
      wrote on last edited by
      #2

      It seems to me that you're trying to do a forward declaration of class DMMMenu in the very file where you declare class DMMMenu.
      As far as I understand what you want to achieve, you should write:
      @namespace DMM {

      namespace Ui {
      
          class DMMMenu: public QWidget
          {
              Q_OBJECT
              /* ... */
          };
      }
      

      }@

      Meaning that you're defining the class DMMMenu in the DMM::Ui namespace.

      `They did not know it was impossible, so they did it.'
      -- Mark Twain

      1 Reply Last reply
      0
      • P Offline
        P Offline
        pragati
        wrote on last edited by
        #3

        hi Johan,

        Thanks for your suggestion. You are right exactly I want to do so but upon trying your suggestion (have done before too...:() I got the following error:

        /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:7: error: 'DMMMenu' does not name a type

        It is not able to recognize class DMMMenu in DMM.cpp file

        :(

        help!!!

        1 Reply Last reply
        0
        • JohanSoloJ Offline
          JohanSoloJ Offline
          JohanSolo
          wrote on last edited by
          #4

          I think this is because your class is defined in the DMM::Ui namespace, and in your implementation file you are implementing DMM::DMMMenu.

          If I were you, I would drop the Ui namespace in the header. Note that I'm unfamiliar with ui files and there might be some black magic in there I don't know about.

          `They did not know it was impossible, so they did it.'
          -- Mark Twain

          1 Reply Last reply
          0
          • P Offline
            P Offline
            pragati
            wrote on last edited by
            #5

            lolzzz.....

            I know the error but if I dont use Ui namespace how wud I use the Dmm_ui.h file....I really dnt have any idea what to remove.....Hate namespace!!!!!

            1 Reply Last reply
            0
            • JohanSoloJ Offline
              JohanSoloJ Offline
              JohanSolo
              wrote on last edited by JohanSolo
              #6

              Well, you need the ui file for the private member Ui::DMMMenu * ui; which already mentions the Ui namespace... and Ui::DMMMenu is just an alias to the Ui_DMM class defined in the ui file. The more I think about this the more I tend to believe you don't need to use Ui namespace in your header as long as the ui member has type Ui::DMMMenu.

              `They did not know it was impossible, so they did it.'
              -- Mark Twain

              1 Reply Last reply
              0
              • P Offline
                P Offline
                pragati
                wrote on last edited by
                #7

                I tried to remove Ui namespace from the header files then I am geeting error :

                /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:12: error: 'class DMM::DMMMenu' has no member named 'setupUi'

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  stima_ua
                  wrote on last edited by
                  #8

                  It's because
                  @
                  //# include <../Include/DMM.h>
                  //# include <ui_DMM.h> //What are you trying include? <> <<- means that is known qt path
                  #include "../Include/DMM.h"
                  #include "ui_DMM.h" // ""<<-means that its your path (depends on the path of the project)
                  @

                  1 Reply Last reply
                  0
                  • R Offline
                    R Offline
                    r3willia
                    wrote on last edited by
                    #9

                    bq. I tried to remove Ui namespace from the header files then I am geeting error...

                    This is because there's a naming collision between DMM::DMMMenu and what was Ui::DMMMenu in the following lines:
                    @namespace DMM {

                    DMMMenu::DMMMenu(QWidget *parent) :
                    QWidget(parent),
                    ui(new Ui::DMMMenu) // When the Ui namespace is removed, I presume this reads "new DMMMenu".@

                    This is because you're in the DMM namespace; the name's resolving to DMM::DMMMenu (which doesn't have a setupUi function).

                    If you want to explicitly construct a DMMMenu object, use "new ::DMMMenu".

                    1 Reply Last reply
                    0
                    • P Offline
                      P Offline
                      pragati
                      wrote on last edited by
                      #10

                      [quote author="stima_ua" date="1337331690"]It's because
                      @
                      //# include <../Include/DMM.h>
                      //# include <ui_DMM.h> //What are you trying include? <> <<- means that is known qt path
                      #include "../Include/DMM.h"
                      #include "ui_DMM.h" // ""<<-means that its your path (depends on the path of the project)
                      @
                      [/quote]

                      Didnt made any difference...still getting same errors

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        pragati
                        wrote on last edited by
                        #11

                        [quote author="r3willia" date="1337332133"]bq. I tried to remove Ui namespace from the header files then I am geeting error...

                        This is because there's a naming collision between DMM::DMMMenu and what was Ui::DMMMenu in the following lines:
                        @namespace DMM {

                        DMMMenu::DMMMenu(QWidget *parent) :
                        QWidget(parent),
                        ui(new Ui::DMMMenu) // When the Ui namespace is removed, I presume this reads "new DMMMenu".@

                        This is because you're in the DMM namespace; the name's resolving to DMM::DMMMenu (which doesn't have a setupUi function).

                        If you want to explicitly construct a DMMMenu object, use "new ::DMMMenu".[/quote]

                        Sorry, I didnt understood....what you want me to change.....

                        1 Reply Last reply
                        0
                        • R Offline
                          R Offline
                          r3willia
                          wrote on last edited by
                          #12

                          bq. Sorry, I didnt understood….what you want me to change…..

                          The following assumes that you've removed the Ui namespace:-
                          In DMM.cpp change line 9 from:
                          @ ui(new DMMMenu)@
                          to
                          @ ui(new ::DMMMenu)@

                          I think that should fix your error: /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:12: error: ‘class DMM::DMMMenu’ has no member named ‘setupUi’

                          1 Reply Last reply
                          0
                          • P Offline
                            P Offline
                            pragati
                            wrote on last edited by
                            #13

                            [quote author="r3willia" date="1337333494"]bq. Sorry, I didnt understood….what you want me to change…..

                            The following assumes that you've removed the Ui namespace:-
                            In DMM.cpp change line 9 from:
                            @ ui(new DMMMenu)@
                            to
                            @ ui(new ::DMMMenu)@

                            I think that should fix your error: /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:12: error: ‘class DMM::DMMMenu’ has no member named ‘setupUi’[/quote]

                            Still getting the error.....I dont knw what to do............arggghhhh

                            1 Reply Last reply
                            0
                            • P Offline
                              P Offline
                              pragati
                              wrote on last edited by
                              #14

                              Using now namespace Ui, still getting error:

                              /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:14: error: 'class DMM::Ui::DMMMenu' has no member named 'setupUi'

                              1 Reply Last reply
                              0
                              • S Offline
                                S Offline
                                stima_ua
                                wrote on last edited by
                                #15

                                Its example.

                                //mainwindow.h
                                @
                                #ifndef MAINWINDOW_H
                                #define MAINWINDOW_H

                                #include <QMainWindow>

                                namespace Ui {
                                class MainWindow;
                                }

                                class MainWindow : public QMainWindow
                                {
                                Q_OBJECT

                                public:
                                explicit MainWindow(QWidget *parent = 0);
                                ~MainWindow();

                                private:
                                Ui::MainWindow *ui;
                                };

                                #endif // MAINWINDOW_H
                                @

                                //mainwindow.cpp
                                @
                                #include "mainwindow.h"
                                #include "ui_mainwindow.h"

                                MainWindow::MainWindow(QWidget *parent) :
                                QMainWindow(parent),
                                ui(new Ui::MainWindow)
                                {
                                ui->setupUi(this);

                                //use ui: ui->button->setText("Text");
                                

                                }

                                MainWindow::~MainWindow()
                                {
                                delete ui;
                                }

                                @

                                --------or-------------
                                //mainwindow.h
                                @
                                #ifndef MAINWINDOW_H
                                #define MAINWINDOW_H

                                #include <QMainWindow>
                                #include "ui_mainwindow.h"

                                class MainWindow : public QMainWindow, public Ui_MainWindow
                                {
                                Q_OBJECT

                                public:
                                explicit MainWindow(QWidget *parent = 0);
                                ~MainWindow();

                                private:

                                };

                                #endif // MAINWINDOW_H
                                @

                                //mainwindow.cpp
                                @
                                #include "mainwindow.h"

                                MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
                                {
                                setupUi(this);

                                //use ui: button->setText("Text");
                                

                                }

                                MainWindow::~MainWindow()
                                {
                                }
                                @

                                1 Reply Last reply
                                0
                                • R Offline
                                  R Offline
                                  r3willia
                                  wrote on last edited by
                                  #16

                                  [quote author="pragati" date="1337334158"] Using now namespace Ui, still getting error:

                                  /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:14: error: 'class DMM::Ui::DMMMenu' has no member named 'setupUi'[/quote]

                                  In the example posted by stima_ua, the Ui namespace is being used by the resources framework to generate a Ui::MainWindow class definition. This is the same as in your case - the DMM_ui.h generates a class definition called Ui::DMMMenu - there is nothing called DMM::Ui::DMMMenu defined. However, in your header DMM.h, you have told the compiler that there's a forward declaration for a type DMM::Ui::DMMMenu - you then use this as the type of your pointer with the lines:
                                  @private:

                                  Ui::DMMMenu *ui;@
                                  

                                  Bear in mind - this is telling the compiler: "I want a pointer of type DMM::Ui::DMMMenu" because you're making this declaration from within the DMM namespace.

                                  If you want to do your implementation using the UI resources from Qt, you'll need to do your declaration like this:
                                  @
                                  namespace Ui {

                                  class DMMMenu;

                                  }

                                  namespace DMM {

                                  class DMMMenu: public QWidget
                                  {
                                  Q_OBJECT

                                  public:

                                  explicit DMMMenu(QWidget *parent = 0);
                                  ~DMMMenu();

                                  private:

                                  ::Ui::DMMMenu *ui;
                                  

                                  };

                                  }@

                                  This tells the compiler that it will receive a full declaration of Ui::DMMMenu later on, and that you want to use Ui::DMMMenu as the type for your ui member pointer in your DMM::DMMMenu class declaration.

                                  1 Reply Last reply
                                  0
                                  • P Offline
                                    P Offline
                                    pragati
                                    wrote on last edited by
                                    #17

                                    I did as you guys told

                                    @
                                    namespace Ui {

                                    class DMMMenu;

                                    }

                                    namespace DMM {

                                    class DMMMenu: public QWidget
                                    {
                                    Q_OBJECT

                                    public:

                                    explicit DMMMenu(QWidget *parent = 0);
                                    ~DMMMenu();

                                    private:

                                    ::Ui::DMMMenu *ui;
                                    

                                    };

                                    }@

                                    But now the compiler is telling the prototype in dmm.cpp and dmm_ui.h doesnot match

                                    1 Reply Last reply
                                    0
                                    • R Offline
                                      R Offline
                                      r3willia
                                      wrote on last edited by
                                      #18

                                      I think that's progress. What's the exact message you're seeing?

                                      1 Reply Last reply
                                      0
                                      • P Offline
                                        P Offline
                                        pragati
                                        wrote on last edited by
                                        #19

                                        :).....

                                        1 /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:8: error: prototype for 'Ui::DMMMenu::DMMMenu(QWidget*)' does not match any in class 'Ui::DMMMenu'

                                        1. /home/pragati/MultiFuncTester/Components/DMM/Build/ui_DMM.h:61: error: candidates are: Ui::DMMMenu::DMMMenu(const Ui::DMMMenu&)

                                        error: Ui::DMMMenu::DMMMenu()

                                        1 Reply Last reply
                                        0
                                        • R Offline
                                          R Offline
                                          r3willia
                                          wrote on last edited by
                                          #20

                                          From the code you've posted of DMM_ui.h, Ui::DMMMenu has no explicit constructor - this means the compiler will have given it an implicit copy constructor of signature Ui::DMMMenu::DMMMenu(const Ui::DMMMenu&) This is the candidate you're seeing.

                                          Do you still use the Ui namespace in your DMM.cpp file? It looks like the compiler's trying to link DMM::DMMMenu against Ui::DMMMenu!

                                          Make sure if there's any ambiguity that you remove it by explicitly specifying the name of the type you're using. Is your code in DMM.cpp now looking something like this?
                                          @
                                          # include <../Include/DMM.h>
                                          # include <ui_DMM.h>

                                          namespace DMM {
                                           
                                          DMMMenu::DMMMenu(QWidget *parent) :
                                              QWidget(parent),
                                              ui(new ::Ui::DMMMenu)
                                          {
                                              ui->setupUi(this);
                                          }
                                           
                                          }@
                                          
                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved