Qt,无法将不完整类型'A *'的参数转换为'const QObject *'
Qt, cannot convert argument of incomplete type 'A *' to 'const QObject *'
我是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
之前出现。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何将向量中的可变参数转换为参数的持有者?
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 将空*参数转换为各种类型的参数是UB吗?
- 将可变参数模板参数转换为 JSON 字符串
- C++ 如何将函数参数转换为字符串
- 功能指针参数参数转换为const
- 避免对模板运算符过载的隐式参数转换
- 将C 方法参数转换为模板参数会因编译错误而失败
- 将参数转换为lpwstr createProcess
- 在与时间一起使用 srand 时,如果我没有time_t参数明确地将参数转换为无符号的 int 参数,这有关系吗?
- 将C++整型模板参数转换为整型"longer"型
- 将参数转换为目标类型时,复制用于直接初始化的构造函数省略
- 将命令行参数转换为qimage
- 将可变数量的参数转换为明确的数量
- SDL 方法,参数转换
- 通过错误检查将参数转换为整数
- 功能参数转换为儿童类C
- 参数转换在课堂上
- 在窗口上将格式化的 C 字符串和参数转换为 wstring