MOC добавление пространства имен к именам классов
-
30-09-2019 - |
Вопрос
У меня возникла эта очень странная проблема при компиляции проекта.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.
Решение
SmpTl
это пространство имен CaptureController
определяется, как он был найден MOC.
То Q_OBJECT
Макрос расширяется в декларацию о staticMetaObject
-Variable внутри вашего определения класса (среди прочего оно расширяется). MOC-файл содержит определение этой переменной.
Если это не правильно, пожалуйста, опубликуйте вашу версию QT и вычерченную версию вашего заголовка-файла.
Другие советы
Я тоже столкнулся с этой проблемой.У меня был код, который выглядел примерно так:
namespace foo {
#ifdef _WIN32
... // This code was fine
#else
#error Not Supported
#endif
}
Это привело MOC к путанице в пространстве имен thinking foo
никогда не закрывался.Очевидно, он не знал _WIN32
был определен, и меня сбил с толку тот факт, что я забыл заключить сообщение об ошибке в кавычки.Меняем его на:
#error "Not Supported"
исправил мою проблему.