首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板化Q_OBJECT基类

模板化Q_OBJECT基类
EN

Stack Overflow用户
提问于 2021-03-19 06:54:19
回答 1查看 108关注 0票数 0

我有几节课:

代码语言:javascript
复制
A.h
class Abase_obj : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QAction* playAction READ playAction CONSTANT)
public:
    Abase_obj(QObject* parent = nullptr) : QObject(parent) {}
    virtual QAction* playAction() = 0;

signals:
    void someSignal()
slots:
    virtual void baseSlot() = 0;
};

template <class T>
class Abase : public Abase_obj
{
public:
    Abase(QObject* parent = nullptr) : Abase_obj(parent) {...}
    void baseSlot() override;
    QAction* playAction() override;
protected:
    QWeakPointer<T> m_currentItem;
};

template <class T>
Abase<T>::baseSlot() {
   auto item = m_currentItem.lock();
   item->someMethodOfTemplateClass(); // here is the error
}

B_inh.h

代码语言:javascript
复制
#include "A.h"

class MediaItem;
class B_inh : public Abase<MediaItem>
{
    Q_OBJECT
    Q_PROPERTY(MediaItem* getItem READ getItem)
public:
    // constructor
    MediaItem* getItem();
public slot:
    // some new slot

}

所以我使用Abase_obj,因为我不能在模板类中键入Q_OBJECT宏并在那里定义一些插槽和信号。我知道我可以定义那些没有模板辅助医务人员的插槽。但是我在这个插槽中直接使用了模板方法。但是由于Abase_obj元对象不知道这个类,我得到了错误: C2039:'someMethodOfTemplateClass':不是'QSharedPointer‘和C2027:使用未定义类型'MediaItem’的成员。所以我有两个问题:第一个问题是我应该如何实现这个插槽,这样它才能工作,第二个问题在上面的评论中。

Upd:如果我使#include "MediaItem.h“而不是向前声明它,我将得到错误:

代码语言:javascript
复制
LNK2001: unresolved external symbol "public: static struct QMetaObject const Abase_obj::staticMetaObject" : in file B_inh.cpp.obj
LNK2001: unresolved external symbol "public: virtual void * __cdecl Abase_obj::qt_metacast(char const *)" : in file B_inh.cpp.obj
LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Abase_obj::metaObject(void)const " : in file B_inh.cpp.obj

如果我将Q_OBJECT宏和所有Q_PROPERTies从Abase_obj中删除,并将它们添加到B_inh类中,则一切都在编译和工作,但我不希望每次在所有派生类中实现这些属性

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-22 10:03:03

密码是正确的。错误发生在我的qbs依赖项中。文件A.h只是没有被编译,也没有被正确地包含到B_inh.h中,所以我有以下链接器错误

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66703725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档