MOC добавляет пространство имен к именам классов - PullRequest
2 голосов
/ 21 апреля 2010

У меня очень странная проблема при компиляции проекта. 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 ]

2 голосов
/ 08 марта 2012

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

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

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

#error "Not Supported"

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

0 голосов
/ 21 апреля 2010

SmpTl - пространство имен CaptureController определено в том виде, в котором оно было найдено MOC.

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

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

...