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

Posted

技术标签:

【中文标题】Qt - moc 导致 C2504:基类未定义【英文标题】:Qt - moc causing C2504: base class undefined 【发布时间】:2011-09-13 20:06:59 【问题描述】:

我遇到了一个我一直试图解决一段时间的问题,但我完全被难住了。所以我有两个类,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) : error C2504: 'X' : base class undefined”。但这在编译 Y.cpp 或 X.cpp 时不会发生,它只会在编译 moc 文件时发生!有任何想法吗?构建将在 moc 阶段失败,并且只有 moc 阶段似乎非常奇怪。非常感谢您的帮助!

【问题讨论】:

通过任何更改,您是否转发了声明类 X 并且不包含标题? 【参考方案1】:

我试过用你给出的描述复制它,但没能复制。

所以,这里有一些值得检查的地方:

包含守卫中的错误?

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

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

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

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

我可以解释的最佳方式是说,在某些情况下,您的标头可以通过对类的前向声明来解决,但 moc 可以生成需要实际创建或销毁类型的代码您的标头仅前向声明。

如果是这种情况,有一种方法可以向 .ui 添加代码,请求包含前向声明类型的额外标头。但最简单的解决方案是在 X.h 或 Y.h 内用适当的标头替换前向声明。

检查 moc_X.cpp 文件的内容

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

【讨论】:

当我阅读 moc 文件时,似乎您的第二点“信号或插槽中使用的类型的前向声明”可能是问题所在。无论如何,我项目中的#includes 结构有点糟糕,当我全部重组它们时,事情就编译好了。谢谢!

以上是关于Qt - moc 导致 C2504:基类未定义的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2504:'BASECLASS':基类未定义

错误 C2504 - 未定义基类

error C2504: 未定义基类

基类未定义,但包含其标头

CArray<TYPE,ARG_TYPE>' : 基类未定义

基类未捕获 C++ 异常