[gelöst] Compiler meldet Fehler, warum?

Verschiedenes zu Qt
Antworten
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

[gelöst] Compiler meldet Fehler, warum?

Beitrag von qtNiko »

hallo,

ich mache meine ersten Gehversuche mit Qt4 und leider auch C++.
Ich habe mir diverse Beispiele angesehen und nun versucht, ein ganz simples Programm selbst zu schreiben.

Also, zuerst mit Designer4 ein Fenster vom Typ QDialog erstellt und im File imagedialog.ui gespeichert. Das Objekt darin heißt ImageDialog3.
Jetzt die Dateien:
File imagedialog3.h :

Code: Alles auswählen

#ifndef IMAGEDIALOG4_H
#define IMAGEDIALOG4_H

#include "ui_imagedialog.h"

class ImageDialog3 : public QDialog, private UI:ImageDialog3
{
     Q_OBJECT

 public:
     ImageDialog3(QDialog *parent = 0);
}

#endif
File imagedialog3.cpp :

Code: Alles auswählen

#include <QtGui>
#include "imagedialog3.h"

ImageDialog3::ImageDialog3(QDialog *parent)
     : QDialog(parent)
 {
     setupUi(this);
 }

File main.cpp :

Code: Alles auswählen

#include <QApplication>
#include "imagedialog3.h"

int main()
{
    QApplication app();
    ImageDialog3 mywindow;
    mywindow.show;
    return app.exec();
 }
All diese Dateien liegen im Projektverzeichnis. Dort nun folgende Eingaben

qmake -project --> Projektdatei wird erzeugt
qmake --> Makefile wird erzeugt
make --> folgende Fehlermeldungen:

imagedialog3.h:6: error: expected class-name before ':' token
imagedialog3.h:6: error: expected `{' before ':' token
imagedialog3.h:6: error: expected unqualified-id before ':' token
imagedialog3.cpp:4: error: invalid use of undefined type 'class ImageDialog3'
imagedialog3.h:6: error: forward declaration of 'class ImageDialog3'
imagedialog3.cpp: In constructor 'ImageDialog3::ImageDialog3(QDialog*)':
imagedialog3.cpp:7: error: 'setupUi' was not declared in this scope

Warum wird ImageDialog3 nicht als Klassenname akzeptiert/erkannt?
Vielleicht lacht sich jetzt jemand kaputt, aber ich stehe total auf dem Schlauch.

Tipps äußerst willkommen, Danke!
Zuletzt geändert von qtNiko am 15. Juni 2007 22:46, insgesamt 1-mal geändert.
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Re: Compiler meldet Fehler, warum?

Beitrag von Volker »

qtNiko hat geschrieben:hallo,

Code: Alles auswählen


class ImageDialog3 : public QDialog, private UI:ImageDialog3
{
     Q_OBJECT

 public:
     ImageDialog3(QDialog *parent = 0);
}

#endif
imagedialog3.h:6: error: expected class-name before ':' token
imagedialog3.h:6: error: expected `{' before ':' token
imagedialog3.h:6: error: expected unqualified-id before ':' token
Wie kommst Du auf UI:ImageDialog3? Komischerweise hab ich das hier schonmal irgendwo gesehen? Es müsste aber wohl eher heissen
Ui_ImageDialog3
Die andere Frage ist warum du ein #ifndef IMAGEDIALOG4_H
hast wenn Deine Klasse ImageDialog3 heisst, aber das ist nur ein logisches Problem, keins was den Compiler interessiert.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ausserdem fehlt ein Semikolion am Ende der Klassendefinition.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Beitrag von qtNiko »

hallo,

danke an die beiden Frühaufsteher für die Antworten. An meinen Uhrzeiten sieht man, dass ich ein Abendarbeiter bin.

Vorab:
a) das #ifndef IMAGEDIALOG4_H stammt noch von meinen diversen Versuchen mit unterschiedlichen Klassennamen.
b) ich arbeite unter Suse openLinux 10.1 und Qt-4.2.3

Leider stimmt mit imagedialog3.h immer noch irgend etwas nicht.
Die neue Datei imagedialog3.h sieht jetzt so aus (Klassendefinition UI_... und ; am Ende):

Code: Alles auswählen

#ifndef IMAGEDIALOG3_H
#define IMAGEDIALOG3_H

#include "ui_imagedialog.h"

class ImageDialog3 : public QDialog, private UI_ImageDialog3
{
     Q_OBJECT

 public:
     ImageDialog3(QDialog *parent = 0);

};

#endif
Die Fehlermeldung dazu mit dem make-Befehl:

Code: Alles auswählen

make
/usr/local/Trolltech/Qt-4.2.3/bin/uic imagedialog.ui -o ui_imagedialog.h
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT  -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.2.3/mkspecs/linux-g++-64 -I. -I/usr/local/Trolltech/Qt-4.2.3/include/QtCore -I/usr/local/Trolltech/Qt-4.2.3/include/QtCore -I/usr/local/Trolltech/Qt-4.2.3/include/QtGui -I/usr/local/Trolltech/Qt-4.2.3/include/QtGui -I/usr/local/Trolltech/Qt-4.2.3/include -I. -I. -I. -o imagedialog3.o imagedialog3.cpp
imagedialog3.h:7: error: expected class-name before '{' token
imagedialog3.cpp: In constructor 'ImageDialog3::ImageDialog3(QDialog*)':
imagedialog3.cpp:7: error: 'setupUi' was not declared in this scope
make: *** [imagedialog3.o] Fehler 1
Mich irritiert das "-m64" im Aufruf von g++, was ja bedeutet, dass alles im 64bit-Mode compiliert wird. Dies ist zwar prinzipiell möglich, da ich einen Athlon64 habe, aber ich hätte erwartet, dass ohne extra Zutun (ich habe nichts dergleichen veranlasst - das macht qmake allein) auf jeden Fall im 32bit-Mode compiliert würde.
Kann es daran liegen? Wie ändere ich das (stammt ja von qmake)?

Ich habe auch die Klassendefinition mit UI::... probiert, wie sie in den Qt-Beispielen zu finden ist:

Code: Alles auswählen

class ImageDialog3 : public QDialog, private UI::ImageDialog3
{
    ...
};
Das gibt auch einen Fehler mit einem Fehlertext ähnlich dem allerersten.
Irgendwie mag der Compiler meine Klassendefinition nicht.

Daher habe ich mal in der ui_imagedialog.h nachgesehen, was dort definiert ist:

Code: Alles auswählen

...
class Ui_ImageDialog3
{
    ...  viele, viele Statements
};

namespace Ui {
    class ImageDialog3: public Ui_ImageDialog3 {};
} // namespace Ui
Danach müssten meinem Anfängerverständnis nach beide Schreibweisen erlaubt sein,
class ImageDialog3 : public QDialog, private UI::ImageDialog3
aber auch
class ImageDialog3 : public QDialog, private UI_ImageDialog3

Was ist hier bloß falsch?

Ich bin total ratlos und frustriert!

Noch ein Hinweis, der relevant sein könnte:
Ich hatte Qt-4.2.3 nach Download als root installiert und danach über Internet als normaler User ein Update geladen. Dieses Update konnte nicht installiert werden, wegen fehlender Schreibrechte.
Also suchte ich, was denn alles heruntergeladen worden war, fand unter /tmp ein Qt-4.2.3 Verzeichnis und installiert als root alles neu - ohne die alte Version zu löschen.

War das ein Fehler?

Vielleicht (und hoffentlich) hat noch jemand Ideen.
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Das mit dem Namespace ist mir noch nie aufgefallen, aber tatsache, dann sollte das auch so gehen. Allerdings fällt mir auf, dass Du immer ein UI verwendest und nicht Ui

Sowohl Namespace als auch Klasse verwenden also ein kleines "i"
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Beitrag von qtNiko »

hallo,

das mit Ui hat mich ein Stück weitergebracht - blöder Fehler, aber ich habe noch keinen Blick für so etwas.

Leider war es das noch nicht ganz.
Immerhin wird jetzt die Klassendefinition akzeptiert.

Nächstes Problem:
mit main.cpp:

Code: Alles auswählen

#include <QApplication>
#include "imagedialog3.h"

int main()
{
    QApplication app();
    ImageDialog3 mywindow;
    mywindow.show;
    return app.exec();
 }
erhalte ich die Fehler beim Compilieren:

main.cpp: In function 'int main()':
main.cpp:8: error: statement cannot resolve address of overloaded function
main.cpp:9: error: request for member 'exec' in 'app', which is of non-class type 'QApplication ()()'

hingegen mit Übergabeparametern:

Code: Alles auswählen

...
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ...
 }
gibt es den Fehler beim Compilieren:

main.cpp: In function 'int main(int, char**)':
main.cpp:8: error: statement cannot resolve address of overloaded function

Allmählich glaube ich, dass mein Compiler nicht richtig tickt. Das Akzeptieren des Statements 'return app.exec();' kann doch nicht davon abhängen, ob die Übergabeparameter angegeben werden oder nicht.
Erfahrungsgemäß liegen die Fehler am Ende doch bei einem selber, aber hier glaube ich es nicht.

Außerdem habe ich die function mywindow.show nicht überladen, sondern einfach wie in vielen Beispielen lediglich aufgerufen. (':(')

Nebenbei: wie fügt man smilies richtig ein, ohne den Text 'javascript...' immer weglöschen zu müssen?

Danke für die Geduld mit einem solchen Anfänger.
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Schau dir lieber mal an was in Zeile 8 steht, und was dort fehlen könnte.

Es ist kein Compilerfehler, sondern ein Eingabefehler. Mehr wird heute nicht verraten...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nur zur Info:
Neben den Libraries, Tuts und Examples hat sich bei deiner Qt-Installations auch ein Programm namens "Assistant" bei dir eingenistet. Mit diesem kannst du gaaanz bequem in der Dokumentation wühlen und suchen (natürlich auch finden ;)).
Schau mal nach QApplication, dann findest du:

Code: Alles auswählen

QApplication ( int & argc, char ** argv )
QApplication ( int & argc, char ** argv, bool GUIenabled )
QApplication ( int & argc, char ** argv, Type type )
QApplication ( Display * display, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0 )
QApplication ( Display * display, int & argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0 )
die Konstruktoren. Wie du siehst existiert kein Default-Konstruktor (einer ohne Parameter). Das heiß für dich dass du am besten deine 2. Variante (die mit argc, argv) wieder aufgreifst ;).

Des weiteren such mal nach show, schau dir das _genau_ an was bei QWidget dazu steht ;)

Ich lege dir den Assistant sehr ans Herz, darin findest du zu so ziemlich jedem Problem die Lösung(en) die du suchst.
Und auch immer schön in den Basis-Klassen weiter suchen (z.B. QTextBrowser->QTextEdit->...->QWidget, usw), denn in der Doku stehen immer nur die Methoden/Properties, welche für die jeweilige Klasse neu hinzukamen.

Grüße
Franz
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

qtNiko hat geschrieben:

Code: Alles auswählen

#include <QApplication>
#include "imagedialog3.h"

int main()
{
    QApplication app(argc, argv);
    ImageDialog3 mywindow;
    mywindow.show;
    return app.exec();
 }
erhalte ich die Fehler beim Compilieren:

main.cpp: In function 'int main(int, char**)':
main.cpp:8: error: statement cannot resolve address of overloaded function

Allmählich glaube ich, dass mein Compiler nicht richtig tickt.
Wenn dem so wäre, wärst Du bestimmt nicht der erste dem das aufgefallen ist. Da aber in der Regel alle Leute ohne schwerwiegendere Probleme QT Programme schreiben können ist es recht wahrscheinlich, dass der Fehler eher bei dir liegt :-)

Du solltest öfter mal genauer hinschauen, denn auch hier ist es wieder mal ein Fehler ähnlich dem "Ui" statt "UI".
qtNiko hat geschrieben:Außerdem habe ich die function mywindow.show nicht überladen, sondern einfach wie in vielen Beispielen lediglich aufgerufen.
So ganz genau gleich rufst Du sie nicht auf, genauer gesagt rufst Du sie gar nicht auf (was dir der Compiler ja auch mitteilt), denn Methoden benötigen zum Aufruf üblicherweise auch Argumente und wenn's nur der "void" Parameter ist. So spätestens jetzt sollte es klar sein oder?
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Beitrag von qtNiko »

Ihr habt ja alle soooo recht :)

Das mit den Klammern ist alte Pascal-Gewohnheit. Ich hatte nämlich bisher immer mit Delphi programmiert. Da gibt es entweder Klammern mit Parametern drin, oder gar keine - na ja, das hier ist halt C++.

Was aber die Parameter bei der Definition von
int main (...)
betrifft, hat mir ein (nun nicht mehr ganz so) schlaues Qt-Buch erklärt, dass man die Parameter weglassen könne, wenn man die Parameter nicht braucht.
Ich verlasse mich wohl besser auf die Tipps in diesem Forum ;)

Mittlerweilen habe ich mein erstes Qt-Programm erfolgreich compiliert und gestartet - whow.

Wie es aussieht, beginnt meine Lernkurve anzusteigen. Dennoch werdet ihr sicher noch mehr von mir hören ':wink:'

Auf jeden Fall aber jetzt schon mal: Danke
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

[gelöst] Compiler meldet Fehler, warum?

Beitrag von qtNiko »

damit ist dieses Thema wohl gelöst.
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Antworten