C , пространства имен, поиск имен в унаследованном классе и Qt

#c #c 11 #qt

#c #c 11 #qt

Вопрос:

Я создал Qt5 с параметром QT_NAMESPACE=Qt_ns .

Следующий код компилируется НОРМАЛЬНО. Но почему?

 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 применим здесь, поскольку он применяется к функции, err, аргументам.
Я искал источники Qt в QMainWindow, но я тоже заблудился в этом.

Итак, перейдем к вам и расширим мои знания, пожалуйста.

Ответ №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 напрямую, не используя пространства имен

Комментарии:

1. Я на самом деле опередил вас в этом. Я выполнил поиск в источнике Qt для QT_BEGIN_NAMESPACE и просмотрел все материалы пространства имен.