我有一个问题,我一直试图解决一段时间,但我完全被难过了。所以我有两个类,X和Y,它们每个都有自己的头文件,X.h和Y.h.每个都是Q_OBJECT,并在头文件中有该宏定义。
class Y: public X { Q_OBJECT ...}
Y读物的定义。 X的定义是:
class X: public QGLWidget {Q_OBJECT ...}
编译时,X.cpp和Y.cpp编译正确,在那个阶段没有问题。 moc文件也生成没有问题。
但是,当标准QT构建过程进行编译moc_X.cpp时,它会给我“C:\ path \ Y.h(34):错误C2504:'X':基类未定义”。但是当它编译Y.cpp或X.cpp时不会发生这种情况,它只会在编译moc文件时发生!有任何想法吗?构建将在moc阶段失败,只有moc阶段似乎非常特殊。非常感谢帮助!
答案 0 :(得分:7)
我已尝试使用您提供的描述复制它,但却无法使用。
所以,这里有值得检查的事情:
包含警卫的错误?
检查您是否意外地在2个不同的标题中(即#ifndef X_H
和#define X_H
行)获得了2个同名的包含警示
(根据您的描述,这可能不太可能:如果错误发生在moc_Y.cpp的编译中,则更有可能)
信号或广告位中使用的类型的前向声明?
有时,信号或插槽中的参数可能需要包含额外的标头。
我可以解释的最好的方法是说有些情况下你的标题可以正确地向类声明,但moc
可以生成需要实际创建或销毁一个代码的代码键入您的标题仅向前声明。
如果是这种情况,有一种方法可以向.ui添加代码,该代码请求包含前向声明类型的额外标头。但最简单的解决方案就是用X.h或Y.h中的相应头代替前向声明。
检查moc_X.cpp文件的内容
如果上述情况没有帮助,如果您还没有这样做,我建议打开有问题的moc文件并阅读代码。一旦你看到它在做什么,它可能会给你一些想法。