MOC добавляет пространство имен к именам классов
У меня очень странная проблема при компиляции проекта. MOC, кажется, добавляет пространство имен к имени класса, который переносится, хотя это нигде не упоминается в файле / классе.
Пространство имен, однако, существует в библиотеке, которую я использую, но оно скрыто далеко в заголовочных файлах, и я не использую его в файлах пользовательского интерфейса. Вот что генерирует MOC:
const QMetaObject SmpTl::CaptureController::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_SmpTl__CaptureController,
qt_meta_data_SmpTl__CaptureController, 0 }};
SmpTl
пространство имен не упоминается нигде в объявлении CaptureController
, но он появляется в сгенерированном MOC файле.cpp.
Я использую Visual Studio с интеграцией QT.
2 ответа
SmpTl
это пространство имен CaptureController
определяется в том, как он был найден MOC.
Q_OBJECT
макрос расширяется в декларации staticMetaObject
- переменная внутри определения вашего класса (помимо прочего, она расширяется). MOC-файл содержит определение этой переменной.
Если это не правильно, пожалуйста, опубликуйте свою версию Qt и урезанную версию вашего заголовочного файла.
Я тоже столкнулся с этой проблемой. У меня был код, который выглядел так:
namespace foo {
#ifdef _WIN32
... // This code was fine
#else
#error Not Supported
#endif
}
Это запутало MOC в думающем пространстве имен foo
никогда не закрывается. Видимо, не знал _WIN32
был определен и сбит с толку тем фактом, что я забыл поставить кавычки вокруг сообщения об ошибке. Меняя это на:
#error "Not Supported"
исправил мою проблему.