Seite 1 von 1

Unverständlich: "Local function definitions are illegal

Verfasst: 21. März 2009 15:14
von Xuttuh
Hallo allerseits,

ich verwende im Moment das Buch zur Qt-Programmierung von Blanchette & Summerfield um Qt zu lernen und habe Probleme, das zweite Listing in diesem Buch zu kompilieren.

Es geht um die Erstellung eines Dialogfeldes zum Suchen von Strings in einm Textfeld.

Listing von finddialog.h:

Code: Alles auswählen

#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QDialog>

class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
	Q_OBJECT

public:
	FindDialog(QWidget *parent = 0);

signals:
	void findNext(const QString &str, Qt::CaseSensitivity cs);
	void findPrevious(const QString &str, Qt::CaseSensitivity cs);

private slots:
	void findClicked();
	void enableFindButton(const QString &text);

private:
	QLabel *label;
	QLineEdit *lineEdit;
	QCheckBox *caseCheckBox;
	QCheckBox *backwardCheckBox;
	QPushButton *findButton;
	QPushButton *closeButton;
};

#endif // FINDDIALOG_H

Und die dazugehörige finddialog.cpp:

Code: Alles auswählen

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

FindDialog::FindDialog(QWidget *parent) : QDialog(parent)
{
	label = new QLabel(tr("Find &what:"));
	lineEdit = new QLineEdit;
	label->setBuddy(lineEdit);

	caseCheckBox = new QCheckBox(tr("Match &case"));
	backwardCheckBox = new QCheckBox(tr("Search &backwards"));

	findButton = new QPushButton(tr("&Find"));
	findButton->setDefault(true);
	findButton->setEnabled(false);

	closeButton = new QPushButton(tr("&Close"));

	connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(const QString &)));
	connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
	connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));

	// Erstellen der Layout-Bereiche (verschachtelt!) und plazieren der Widgets
	
	QHBoxLayout *topLeftLayout = new QHBoxLayout;
	topLeftLayout->addWidget(label);
	topLeftLayout->addWidget(lineEdit);

	QVBoxLayout *leftLayout = new QVBoxLayout;
	leftLayout->addLayout(topLeftLayout);
	leftLayout->addWidget(caseCheckBox);
	leftLayout->addWidget(backwardCheckBox);

	QVBoxLayout *rightLayout = new QVBoxLayout;
	rightLayout->addWidget(findButton);
	rightLayout->addWidget(closeButton);
	rightLayout->addStretch();

	QHBoxLayout *mainLayout = new QHBoxLayout;
	mainLayout->addLayout(leftLayout);
	mainLayout->addLayout(rightLayout);
	setLayout(mainLayout);

	// Titel des Dialogfeldes und ideale Größe des Feldes einstellen 

	setWindowTitle(tr("Find"));
	setFixedHeight(sizeHint().height());
	
	// Implementieren der Funktionen der SLOTS des Feldes:
	
	void FindDialog::findClicked()
	{
		QString text = lineEdit->text();
		Qt::CaseSensitivity cs = caseCheckBox->isChecked()? Qt::CaseSensitive : Qt::CaseInsensitive;
		if (backwardCheckBox->isChecked())
		{
			emit findPrevious(text, cs);
		}
		else
		{
			emit findNext(text, cs);
		}
	}

	void FindDialog::enableFindButton(const QString &text)
	{
		findButton->setEnabled(!text.isEmpty());
	}
}
sowie hier noch die main.cpp:

Code: Alles auswählen

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

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	FindDialog *dialog = new FindDialog;
	dialog->show();
	return app.exec();
}
Ich erhalte beim kompilieren ständig die folgende Fehlermeldung:

"'FindDialog::findClicked' : local function definitions are illegal"

Der Compiler verhält sich also so, als hätte ich die fragliche Funktion gar nicht deklariert - das habe ich aber doch durch das Einbinden der Header-Datei getan, da steht die Funktionsdeklaration doch drin?? Warum erkennt er die Funktion dann nicht?

Ich danke euch schon im Voraus vielmals für eure Hilfe!

Grüße

Verfasst: 21. März 2009 16:27
von franzf
Schau dir mal GENAU an, wo du in der finddialog.cpp die geschweifte Klammer deines Konstruktors zumachst ;)

In C++ geht das entstandene Konstrukt nicht:

Code: Alles auswählen

void func() {
    someCode();
    void anotherFunc() {
        moreCode();
    }
}
In Python hingegen würde das durchaus gehen!

Vielen Dank!

Verfasst: 21. März 2009 16:50
von Xuttuh
Hallo franzf,

vielen Dank für den Hinweis! Man darf also Funktionen nicht ineinander verschachteln... Wieder was dazugelernt!

Immer wieder erstaunlich, was eine geschweifte Klammer an der falschen Stelle alles anrichten kann :shock:

Jetzt funktioniert alles wunderbar, also danke nochmal!

Gruß