是否可以将模板派生的C++类与Qt的Q_OBJECT混合使用?

neu*_*rte 11 c++ qt templates qobject

在我的应用程序中,我有以下类层次结构:

class Word
{
    ...
}

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

class WordDictionary : public Dictionary<Word>
{
    Q_OBJECT

    ...
}
Run Code Online (Sandbox Code Playgroud)

WordDictionary类解析需要很长时间的字典.我正在一个单独的线程中运行解析函数,我希望它能够不时地通知GUI线程,以根据正在解析的当前行号提供进度更新.这就是我希望它成为Q_OBJECT的原因.我试图使基类Dictionary成为Q_OBJECT,但得到的消息是不支持Q_OBJECT模板.当我删除宏,只留下WordDictionary作为Q_OBJECT时,我得到一堆一般形式的错误消息:

\ GeneratedFiles \发布\ moc_dictionary.cpp(44):错误C2039: 'staticMetaObject':不是'词典'中的一员

[
T =字
]

有什么办法可以让我的模板派生的WordDictionary类成为Q_OBJECT而不是硬编码里面的模板函数,产生了很多样板代码吗?

编辑:将模板声明更改为:

template <typename T> class Dictionary : public QObject
Run Code Online (Sandbox Code Playgroud)

使代码编译.我不确定我是不是做了一些愚蠢的事情,如果能够正常工作的话.

Ste*_*end 15

你不能直接这样做,但有可用的工作轮.请参阅此处的文章.

虽然理论上moc可以处理模板,但实现起来非常复杂,并且使用起来非常不切实际:对于每个模板实例化,moc必须生成适当的元对象代码,生成的代码将具有每个链接单元包含一次---一旦模板类与不同编译单元中的相同模板参数一起使用,这就变成了一个噩梦.

如果信号和槽不需要模板参数作为原型的一部分,则解决方法是使模板类继承提供所需信号和槽的QObject子类.如果信号和插槽需要使用模板参数,则Observer模式是另一种选择.