MOC добавление пространства имен к именам классов

StackOverflow https://stackoverflow.com/questions/2684508

  •  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"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top