Можно ли смешивать классы C ++, полученные из шаблонов, с Qt Q_OBJECT? - PullRequest
10 голосов
/ 21 ноября 2010

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

class Word
{
    ...
}

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

class WordDictionary : public Dictionary<Word>
{
    Q_OBJECT

    ...
}

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

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

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

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

template <typename T> class Dictionary : public QObject

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

Ответы [ 2 ]

14 голосов
/ 21 ноября 2010

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

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

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

2 голосов
/ 21 ноября 2010

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

#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();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...