C ++,名称空间,继承类和Qt上的名称查找

时间:2014-06-26 10:04:00

标签: c++ c++11 qt

我使用QT_NAMESPACE = Qt_ns选项构建了Qt5。

以下代码编译正常。但为什么呢?

QT_BEGIN_NAMESPACE
namespace Ui {
  class MainWindow;
}
QT_END_NAMESPACE

namespace test_ns
{
class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();

private:
  Qt_ns::Ui::MainWindow *ui;
};    
}

QMainWindow包含在命名空间Qt_ns中,所以我认为有必要在此名称前加上Qt_ns,如

class MainWindow : public Qt_ns::QMainWindow

我徒劳无功,阅读C ++标准无济于事。 我认为ADL不适用于此,因为它适用于函数,错误,参数。 我在QMainWindow上搜索了Qt来源,但我也迷失了。

所以,请告诉你并扩展我的知识。

1 个答案:

答案 0 :(得分:1)

检查qglobal.h,如果未定义QT_USE_NAMESPACE,您会看到QT_NO_USING_NAMESPACE。以下评论:

# ifndef QT_NO_USING_NAMESPACE
   /*
    This expands to a "using QT_NAMESPACE" also in _header files_.
    It is the only way the feature can be used without too much
    pain, but if people _really_ do not want it they can add
    DEFINES += QT_NO_USING_NAMESPACE to their .pro files.
    */
   QT_USE_NAMESPACE
# endif

这允许直接使用QMainWindow而不使用命名空间