Qt,无法将不完整类型'A *'的参数转换为'const QObject *'

Qt, cannot convert argument of incomplete type 'A *' to 'const QObject *'

本文关键字:参数 转换 QObject const 类型 Qt      更新时间:2023-10-16

我是Qt的新手,当我研究插槽/信号时,我发现奇怪的行为。

如果我写下面的代码,就可以了。

class A;
class B;
class A : public QObject {
Q_OBJECT
signals:
    void signal(B*);
};
class B : public QObject {
Q_OBJECT
public slots:
    void slot(B*) {};
public:
    void f(A* a) {
        connect(a, SIGNAL(signal(B*)), this, SLOT(slot(B*)));
    }
};

但是如果我交换A类和B类的定义:

class A;
class B;
class B : public QObject {
Q_OBJECT
public slots:
    void slot(B*) {};
public:
    void f(A* a) {
        connect(a, SIGNAL(signal(B*)), this, SLOT(slot(B*)));
    }
};
class A : public QObject {
Q_OBJECT
signals:
    void signal(B*);
};

我得到一个错误:

main.cpp:30:9: error: no matching member function for call to 'connect'
    connect(a, SIGNAL(signal(B*)), this, SLOT(slot(B*)));
    ^~~~~~~
/Users/Alexander/Qt/5.3/clang_64/lib/QtCore.framework/Headers/qobject.h:198:36:
    note: candidate function not viable: 
        cannot convert argument of incomplete type 'A *' to 'const QObject *'
        static QMetaObject::Connection connect(const QObject *sender, const char *signal,

为什么会这样?

我使用QT 5.3.

谢谢。

注。对不起,我的英语不好。

去掉所有的赘肉来理解发生了什么可能是一个好主意:

class QObject {};
class A;
void connect(QObject*) {}
void f(A* a) {
    connect(a);
}
class A : public QObject {};
int main()
{
    A a;
    f(&a);
}

这是你所拥有和经历的相同问题的简化版本。问题是,在调用connect时,A只被前向声明。编译器还不知道A继承自QObject。稍后才定义A并指定它。要做到这一点,A的定义必须在调用connect之前出现。