Forward Declaration error
-
I did as you guys told
@
namespace Ui {class DMMMenu;
}
namespace DMM {
class DMMMenu: public QWidget
{
Q_OBJECTpublic:
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
-
I think that's progress. What's the exact message you're seeing?
-
:).....
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'
- /home/pragati/MultiFuncTester/Components/DMM/Build/ui_DMM.h:61: error: candidates are: Ui::DMMMenu::DMMMenu(const Ui::DMMMenu&)
error: Ui::DMMMenu::DMMMenu()
-
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); } }@
-
I did changed to Namespace DMM...but prob is I have to create an instance of this DMM in other directory class like this:
Start.h
@
#ifndef START_H
#define START_H#include "../../DMM/Include/DMM.h"
/****************************************************************************/
/**- \brief This class handles the initialization of the user interface.
/
/***************************************************************************/
namespace Start {
class Startup : public QObject
{
Q_OBJECTpublic:
Startup();
virtual ~Startup();
void GuiInit();private:
Ui::DMMMenu *MainWindow;
};
}
#endif // START_H
@Start.cpp:
@
#include "../../Start/Include/Start.h"
namespace Start {
Startup::Startup() : QObject() { // GUI components MainWindow = new DMM::DMMMenu();
}
Startup::~Startup()
{
try {
// GUI Componentsdelete MainWindow; } catch (...) {}
}
/***************************************************************************/
/!- \brief Initializes the user interface
/
/***************************************************************************/
void Startup::GuiInit()
{
MainWindow->show();
}
}
@
So now I am getting errors like these upon changing namespace to DMM:
- /home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:-1: In constructor 'Start::Startup::Startup()':
/home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:12: error: cannot convert 'DMM::DMMMenu' to 'Ui::DMMMenu*' in assignment*
2./home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:35: error: invalid use of incomplete type 'struct Ui::DMMMenu'
3./home/pragati/MultiFuncTester/Components/Start/Build/../../DMM/Include/DMM.h:9: error: forward declaration of 'struct Ui::DMMMenu'
- \brief This class handles the initialization of the user interface.
-
That's good - it means the compiler's got past the problem you were having before - now you've got the problem that you're using the wrong type for your member of Start::Startup.
I expect you want Start::Startup's declaration to read:
@class Startup : public QObject
{
Q_OBJECTpublic:
Startup();
virtual ~Startup();
void GuiInit();private:
DMM::DMMMenu *MainWindow;
};@
DMM::DMMMenu has a Ui::DMMMenu, but DMM::DMMMenu is not a Ui::DMMMenu (to use Object-orientated is-a / has-a terminology).
-
:(
I used it already before but as soon as I do this:
@DMM::DMMMenu *MainWindow;
@
I get error that
1./home/pragati/MultiFuncTester/Components/Start/Build/../../Start/Include/Start.h:27: error: 'DMM' does not name a typeand
2./home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:35: error: 'MainWindow' was not declared in this scope
-
You're referencing DMM from within the namespace Start; it's possible you may have to be specific i.e. declare the parameter:
@::DMM::DMMMenu *MainWindow;@Also make certain that "../../DMM/Include/DMM.h" does indeed define DMM::DMMMenu.
-
r3Willia,
I am still getting errors but not regarding this....anyways thank you so much...you came when I was not getting help from anyone....Thank you so much....wish I cud have personally thanked you...bt anyways....all the best and again ty....
-
hi...
Everything is working fine until when I write in main. In main I included one of the subdirectory's .h file and wrote some function like this I am posting here both the codes of main and that directory....
Error I am getting is :
/home/pragati/MultiFuncTester/Components/Main/Source/Main.cpp:-1: error: undefined reference to `Start::Startup::Startup()'
/home/pragati/MultiFuncTester/Components/Main/Source/Main.cpp:-1: error: undefined reference to `Start::Startup::GuiInit()'
/home/pragati/MultiFuncTester/Components/Main/Source/Main.cpp:-1: error: undefined reference to `Start::Startup::~Startup()'
Similiar error for GuiInit....
Start.h
@
#ifndef START_H
#define START_H#include "../../DMM/Include/DMM.h"
/****************************************************************************/
/**- \brief This class handles the initialization of the user interface.
/
/***************************************************************************/
namespace Start {
class Startup : public QObject
{
Q_OBJECTpublic:
Startup();
virtual ~Startup();
void GuiInit();private:
DMM::DMMMenu *MainWindow;
};
}
#endif // START_H
@
Start.cpp
@
#include "../../Start/Include/Start.h"
namespace Start {Startup::Startup() : QObject()
{// // GUI components
MainWindow = new DMM::DMMMenu();
}
/***************************************************************************/
/!- \brief Initializes the user interface
/
/***************************************************************************/
void Startup::GuiInit()
{
MainWindow->show();
}
}
@Main.cpp
@
#include "../../Start/Include/Start.h"
#include <QApplication>
#include <QtGui>int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Start::Startup start;
start.GuiInit();
return app.exec();
}@
- \brief This class handles the initialization of the user interface.