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.


person Florin    schedule 21.04.2010    source источник


Ответы (2)


SmpTl — это пространство имен, в котором определено CaptureController, как оно было обнаружено MOC.

Макрос Q_OBJECT заменяется объявлением переменной staticMetaObject внутри определения вашего класса (среди прочего, во что он заменяется). MOC-файл содержит определение этой переменной.

Если это не так, опубликуйте свою версию Qt и урезанную версию вашего заголовочного файла.

person Pieter    schedule 21.04.2010
comment
Я нашел проблему, это был отсутствующий '' в ассемблерном коде какого-то заголовочного файла далеко в списке включения. Код был #ifdef'ирован только для архитектуры MIPS, поэтому компилятор не жаловался на отсутствие , но MOC как-то запутался. - person Florin; 22.04.2010

Я также столкнулся с этой проблемой. У меня был код, который выглядел так:

namespace foo {
    #ifdef _WIN32
    ...   // This code was fine
    #else
    #error Not Supported
    #endif
}

Это запутало MOC, заставив думать, что пространство имен foo никогда не закрывается. Очевидно, он не знал, что _WIN32 был определен, и был сбит с толку тем фактом, что я забыл поставить кавычки вокруг сообщения об ошибке. Изменение его на:

#error "Not Supported"

исправил мою проблему.

person Nathan Monteleone    schedule 07.03.2012
comment
Столкнулся с такой же проблемой, спасибо! Я должен добавить, что это происходило только в том случае, если строка #error содержала символ одинарной кавычки '. Удаление ' или заключение строки ошибки в двойные кавычки " устранило проблему для меня. - person Hossein; 16.04.2014