"Статический полиморфизм с сигналом / слотом Qt: что не так?" - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь использовать статический полиморфизм вместо динамического полиморфизма с механизмом сигнал / слот Qt.Но я получаю ошибку компиляции.Что не так в моем коде?Что такое обходной путь?

devices.h

#ifndef DEVICES_H
#define DEVICES_H

#include <QtCore>
#include <qdebug.h>
class DeviceController : public QObject

{
    Q_OBJECT
public:
    explicit DeviceController(QObject *parent = nullptr):QObject(parent){}
    virtual ~DeviceController() {}
    void doAllDevicesInit(){
        emit deviceAInitSignal();
    }

signals:
    void deviceAInitSignal();
};

template<typename T> class BaseDevice  {
public:
    void init() {
        static_cast<T*>(this)->doInit();
        qDebug() << QString("BaseDevice initialized!");
    }
};

class DeviceA : public BaseDevice<DeviceA> {
public:
    void doInit() {
        qDebug() << "DeviceA initialized!";
     }
};
#endif // DEVICES_H

main.cpp

#include "devices.h"
int main(int argc, char *argv[])
{
    Q_UNUSED(argc);Q_UNUSED(argv);

    DeviceA deviceA;
    DeviceController deviceController;

   QObject::connect(&deviceController,&DeviceController::deviceAInitSignal,
                         &deviceA, &DeviceA::init);

    deviceController.doAllDevicesInit();
    return 0;
}

Компиляциявывод

Qt5.12.2 / 5.12.2 / gcc_64 / include / QtCore / qobjectdefs_impl.h: 414: 94: ошибка: недопустимый static_cast от типа 'QObject *' до типа 'QtPrivate:: FunctionPointer :: *) ()> :: Object * '{aka' BaseDevice * '} FuncType :: вызов шаблона (static_cast (this _) -> функция, static_cast (r), a);

1 Ответ

1 голос
/ 24 мая 2019

Благодаря комментарию drescherjm, обходной путь следующий:

devices.h

...

template<typename T> 
class BaseDevice: public QObject  {
//Q_OBJECT, Error: Template classes not supported by Q_OBJECT
public:
    explicit BaseDevice(QObject *parent = nullptr):QObject(parent){}
    virtual ~BaseDevice() {}
    void init() {
        static_cast<T*>(this)->doInit();
        qDebug() << QString("BaseDevice initialized!");
    }
};

class DeviceA : public BaseDevice<DeviceA> {
Q_OBJECT
public:
    explicit DeviceA(QObject *parent = nullptr):BaseDevice<DeviceA>(parent){}
    virtual ~DeviceA() {}
    void doInit() {
        qDebug() << "DeviceA initialized!";
     }
};
#endif // DEVICES_H
...