4

我在派生类中遇到过这种情况,但与 QDialog 基类相同:

当我做

QDialog dialog();
dialog.exec();

编译器抱怨

J:\...\mainwindow.cpp:-1: In member function 'void MainWindow::on_viewButton_pressed()':
J:\...\mainwindow.cpp:72: Fehler:request for member 'exec' in 'dialog', which is of non-class type 'QDialog()'

这与正在使用的构造函数有关,因为当我这样做时

QDialog dialog(0);
dialog.exec();

代码编译没有错误。这也有效:

QDialog *dial = new QDialog();
dial->exec();

所以。是因为显式构造函数吗?

文档说它被定义为

QDialog::QDialog ( QWidget * parent = 0, Qt::WindowFlags f = 0 )

那么前两个示例不应该完全相同吗?以及为什么编译器在第二行抱怨,而不是在构造函数中抱怨。

感谢您的启发,非常欢迎对该主题的进一步阅读提示

4

2 回答 2

8

QDialog dialog();

这声明了一个名为 dialog 的函数,它不接受任何内容并返回一个QDialog

如果这让您感到惊讶,假设您将变量命名为 f 而不是 dialog。我们得到什么?

QDialog f();

现在看起来更像一个函数,不是吗?:)

你需要

QDialog dialog;

总是,当某些东西可以解释为声明和其他东西时,编译器总是解决歧义,支持声明

于 2011-06-25T14:04:09.510 回答
2
QDialog dialog;

QDialog是使用默认构造函数在堆栈上创建的正确语法。

于 2011-06-25T14:04:08.560 回答