Qt - moc导致C2504:基类未定义

Gra*_*ity 3 qt

我有一个问题,我一直试图解决一段时间,但我完全被难倒了.所以我有两个类,X和Y,它们每个都有自己的头文件,Xh和Yh每个都是Q_OBJECT,并且在头文件中有这个宏定义.

class Y: public X { Q_OBJECT ...}
Run Code Online (Sandbox Code Playgroud)

Y读物的定义.X的定义如下:

class X: public QGLWidget {Q_OBJECT ...}
Run Code Online (Sandbox Code Playgroud)

当我编译时,X.cpp和Y.cpp正确编译,在那个阶段没有问题.moc文件也生成没有问题.

但是,当标准QT构建过程进行编译moc_X.cpp时,它会给我"C:\ path\Yh(34):错误C2504:'X':基类未定义".但是当它编译Y.cpp或X.cpp时不会发生这种情况,它只会在编译moc文件时发生!有任何想法吗?构建将在moc阶段失败,只有moc阶段似乎非常特殊.非常感谢帮助!

Cla*_*rae 7

我试过用你给出的描述来复制它,但是还是没能.

所以,这里有值得检查的事情:

包括警卫在内的错误?

检查你是否意外地在2个不同的标题(即#ifndef X_H#define X_H行)中获得了2个同名的包含警卫

(根据您的描述,这可能不太可能:如果错误发生在编译moc_Y.cpp中,则更有可能)

信号或插槽中使用的类型的前向声明?

有时,信号或插槽中的参数可能需要包含额外的标头.

我可以解释它的最好的方法是说有些情况下你的标题对于类的前向声明是好的,但是moc可以生成需要实际创建或销毁你的标题只向前声明的类型的代码.

如果是这种情况,有一种方法可以向.ui添加代码,该代码请求包含前向声明类型的额外标头.但最简单的解决方案就是用Xh或Yh中的相应头替换前向声明

检查moc_X.cpp文件的内容

如果上面没有帮助,如果你还没有这样做,我建议打开有问题的moc文件并阅读代码.一旦你看到它在做什么,它可能会给你一些想法.