如何在c++中处理命名空间



我已经在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工具创建的,所以它不能包含在你的声明中

相关内容

  • 没有找到相关文章

最新更新