Можно ли смешивать полученные на основе С++ классы с Qt Q_OBJECT?

В моем приложении у меня есть следующая иерархия классов:

class Word
{
    ...
}

template <typename T> class Dictionary
{
    ...
};

class WordDictionary : public Dictionary<Word>
{
    Q_OBJECT

    ...
}

Класс WordDictionary анализирует словарь, который занимает много времени. Я запускаю функцию синтаксического анализа из отдельного потока, и я хочу, чтобы он мог время от времени сигнализировать поток графического интерфейса, чтобы предоставлять обновления прогресса на основе текущего синтаксического номера строки. Поэтому я хочу, чтобы это был Q_OBJECT. Я попытался сделать словарь базового класса Q_OBJECT, но получил сообщение о том, что шаблоны Q_OBJECT не поддерживаются. Когда я удалил макрос, оставив только WordDictionary как Q_OBJECT, я получаю кучу сообщений об ошибках общей формы:

.\GeneratedFiles\Release\moc_dictionary.cpp(44): ошибка C2039: "staticMetaObject": не является членом "Словаря"
       с
       [
           T = Слово
       ]

Есть ли что-нибудь, что я могу сделать, чтобы сделать класс WordDictionary, полученный на основе шаблона, Q_OBJECT, отличным от жесткого кодирования функций шаблона внутри него, создавая много шаблонов?

изменить: Изменение объявления шаблона:

template <typename T> class Dictionary : public QObject

сделал компиляцию кода. Я не уверен, что я не делаю что-то глупое, и если это будет работать правильно, тем не менее.

Ответ 1

Вы не можете сделать это напрямую, но есть полезные рабочие раунды. См. Статью здесь.

Хотя теоретически возможно moc для обработки шаблонов, это будет чрезвычайно сложно реализовать, и было бы крайне нецелесообразно использовать: Для каждого экземпляра шаблона moc должны были бы создать соответствующие метаобъектный код и сгенерированный код должен быть включен один раз на единицу связи, которая становится кошмар для поддержания шаблона класс используется с тем же шаблоном параметр в другой компиляции ед.

Если сигналы и слоты не требуются параметр шаблона, который должен быть частью прототип, обходным путем является сделать класс шаблона наследованием Подкласс QObject, который обеспечивает требуемые сигналы и слоты. Если сигналов и слотов необходимо использовать параметры шаблона, Наблюдатель шаблон является альтернативой.

Ответ 2

Я просто пробовал этот код, и он компилируется и работает нормально:

#include <QtCore/QCoreApplication>
#include <QObject>

class Word
{

};

template <typename T> class Dictionary
{

};

class WordDictionary : public Dictionary<Word>, QObject
{
    Q_OBJECT
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    WordDictionary wd();
    return a.exec();
}

Может быть, я что-то пропустил?