我已经在QtDesigner中创建了一个对话框
//---------- *.H
namespace Ui {
class MyDialog;
}
class MyDialog : public QDialog {
Q_OBJECT
public:
explicit MyDialog(QWidget* parent = 0);
~MyDialog();
private:
Ui::MyDialog* ui;
};
及其来源
// --------- *.CPP
MyDialog::MyDialog(QWidget* parent = 0) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
//..
}
我想在一个特定的命名空间封装结构,所以我有com::example::mydialogs::MyDialog像:
//---------- *.H
namespace com {
namespace example {
namespace mydialogs {
namespace Ui {
class MyDialog;
}
class MyDialog : public QDialog {
Q_OBJECT
public:
explicit MyDialog(QWidget* parent = 0);
~MyDialog();
private:
Ui::MyDialog* ui;
};
}}} //namespace closing
及其来源
// --------- *.CPP
namespace com {
namespace example {
namespace mydialogs {
MyDialog::MyDialog(QWidget* parent = 0) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
//..
}
}}} //namespace closing
但是我的编译器报错了一个消息:
C:MyProjectsTestcomexamplemydialogsMyDialog.h:29:错误:forward声明' classcom::example:: MyDialog::Ui::MyDialog'类MyDialog;
命名空间Ui由Qt自动添加。如何正确使用名称空间结构?
为了转发声明一个名称空间,您需要使用以下规范语法:
namespace ns1
{
namespace ns2
{
//....
namespace nsN
{
class a;
}
//....
}
}
上面的代码片段取自这里。因此,在您的情况下,需要关闭forward声明所在的名称空间。
namespace com {
namespace example {
namespace mydialogs {
namespace Ui {
class MyDialog;
}
} // mydialogs
} // example
} // com
namespace com {
namespace example {
namespace mydialogs {
class MyDialog : public QDialog {
Q_OBJECT
public:
explicit MyDialog(QWidget* parent = 0);
~MyDialog();
private:
Ui::MyDialog* ui;
};
}}} //namespace closing
您的实现代码看起来正确。对头文件做这些细微的修改,它就可以编译了。
我没有测试这段代码。使用风险自负
把Ui::MyDialog
放在外面
namespace Ui {
class MyDialog;
}
namespace com {
namespace example {
namespace mydialogs {
...
因为前向声明Ui::MyDialog是在处理Ui文件时由Ui工具创建的,所以它不能包含在你的声明中