Qt,不能转换不完整类型的参数' A *' to' const QObject *'

时间:2014-06-21 12:23:44

标签: c++ qt

我是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。

感谢。

P.S。抱歉我的英文。

1 个答案:

答案 0 :(得分:5)

摆脱所有残障以了解正在发生的事情可能是一个好主意:

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之前。