#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 и просмотрел все материалы пространства имен.