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

标签 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。

谢谢。

附注对不起我的英语。

最佳答案

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

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

关于c++ - Qt,无法将不完整类型 'A *' 的参数转换为 'const QObject *',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24341565/

相关文章:

c++ - 如何在 C++ 中急切提交分配的内存?

C++ 两个数组元素搜索

C++ 在 Windows 中播放音频

c++ - QImage@@QEAA@$$QEAV0@@Z 无法位于 dll 中

c++ - 如何使用 QSqlQuery 和 SQLite 从新插入的行中获取 ID?

c++ - 如何从 bash 脚本捕获终端输出并将其显示在我的 Qt UI 中?

c++ - 从Qt C++调用已编译的C库函数会产生意外行为

c++ - 在创建 OpenCL 上下文之前设置线程亲和性会导致段错误

qt - 如何使用自定义(不可编辑)委托(delegate)创建模型/ View TableView?

c++ - Qt - 如何在行编辑中捕捉键盘事件?