未知的类型名称'class';你的意思是'上课'吗?

时间:2011-12-21 10:58:16

标签: c++ objective-c ios5

我试图从SpeakHere Apple Xcode项目示例中实现AQRecorder.h类,但即使我将我的实现类重命名为ext。 *.mm #import "AQRecorder.h"并且"Unknown type name 'class'; did you mean 'Class'?"行仍然出现错误{{1}}和其他许多错误。 根据我的意思是它不被认为是C ++类。

任何帮助将不胜感激。

13 个答案:

答案 0 :(得分:50)

我刚刚遇到了这个问题。我有一个使用AQRecorder.mm的AQRecorder类的视图控制器。

当我在视图控制器中包含AQRecorder.h时,会发生这些错误。它在我看来是因为我直接的objective-c视图控制器(命名为.m文件)包含编译器抛出虚假错误的C ++头文件。

有两种解决方案。最快的方法是将视图控制器类(包括AQRecorder.h)重命名为.mm文件,在我的案例中将UIRecorderViewController从.m重命名为.mm。

或者,移动以下内容包括:

#include "CAStreamBasicDescription.h"
#include "CAXException.h"

从AQRecorder.h进入AQRecorder.mm。这意味着在您的普通Obj-C源中将不再包含直接C ++样式头文件(通过引用)。

希望有所帮助,并且有意义。

答案 1 :(得分:22)

就我而言,这个错误是由两个类中的循环“导入”语句引起的:每个类的头文件包含另一个类的标题,导致未知类型名称'ClassA';你的意思是'ClassB'吗?错误:

enter image description here

这是我收到此错误时配置导入语句的方式。在ClassA.h

Import "ClassB.h"

ClassB.h

Import "ClassA.h"

为了修复它,我使用@class前向声明指令在ClassB.h中转发声明ClassA(这使得预编译器承诺ClassA是一个有效的类,并且它将在以下位置提供:编译时间)。例如:

ClassA.h

Import "ClassB.h"

ClassB.h

@class ClassA;

这修复了未知类型名称'ClassA'错误,但也引入了一个新错误:ClassB.m接收器类型'ClassA'例如消息是前向声明。 例如:

enter image description here

要解决此新错误,我必须在ClassB(ClassA.h)的实现文件顶部导入ClassB.m。这两个错误现在都已解决,我得到零错误和警告。

例如,我现在有:

ClassA.h

Import "ClassB.h"

ClassB.h

@class ClassA;

ClassB.m

Import "ClassA.h"

现在已解决这两个错误消息。

答案 2 :(得分:9)

我遇到了同样的错误,希望我的解决方案可以帮到你。 Xcode编译器可以编译objective-c& “* .mm”文件中的c ++,因此您可以更改所有使用“.mm”后缀导入“AQRecorder.h”(所有直接和间接)文件的文件名。但你可能不这样做,你可能会发现SpeakHereController和SpeakHereViewController之间的关系有点棘手,我刚学会了他如何使用它,在nib文件中创建SpeakHereController对象,所以SpeakHereViewController文件不必导入“AQRecorder” .h“文件。我的英语很愚蠢,我希望我的回答可以帮助你。

答案 3 :(得分:4)

重要提示:在编译器设置中选择“Compile Source As”变量,并将其值设置为“Objective-C ++”。

答案 4 :(得分:2)

看起来这个问题无法解决。 如果可以将#include“myC ++。h”转换为* .mm文件,那么它可以工作。 但是,如果您需要从objectiveC.h文件中使用它,它将失败。 我想这是来自苹果的错误。有一种方法可以指定* .mm而不是* .m 但没有类似* .hh而不是* .h

答案 5 :(得分:1)

我今天解决了这个问题。如果#include或#import YourHeader.h 中的C ++ * .h文件或C ++ / OC混合* .h文件,你必须有一个 YourHeader.mm 。如果没有,则所有C ++文件和C ++ / OC混合文件都将显示编译错误。

答案 6 :(得分:0)

使用XCode,可以使用“语言”Objective C ++,它允许您混合使用Objective C和C ++。

答案 7 :(得分:0)

我的解决方案可能看起来很荒谬,但在xcode 4.2中,

要添加Apple Audio示例代码,我会单独移动所有文件,并将其作为魅力!

我的意思是不是拖动整个文件夹,在特定文件夹中逐个拖动所有单个文件。

答案 8 :(得分:0)

我解决了以下问题:

最初,文件放在项目中,但不在正确的文件结构内。

是的,我知道它不是一个真正的结构,因为它仅用于视觉问题,但是当我移动标题和PROJ文件夹内的CPP文件全部工作时。

答案 9 :(得分:0)

可以通过更改以下构建设置来解决此问题:

Apple LLVM编译器4.2 - 语言

C ++语言方言(Gnu ++ 11适合我) C ++标准库(Libc ++适用于我)

如果您让Xcode使用文件扩展名来决定如何编译每个文件,还必须将.m文件命名为.mm。

答案 10 :(得分:0)

根据我自己的经验,应该注意以下事项。

  1. 在编译器设置中选择“Compile Source As”变量并将其值设置为“Objective-C ++”,即Build Settings-> Apple LLVM 5.1 - Language-> Compile Source As-> Objective-C ++(在Xcode 5.1.1)

  2. 将包含C ++头文件的相关文件从.m更改为.mm(有时需要将所有.m更改为.mm)。上面的@Diziet回答了这个问题。

  3. 如果您遇到不兼容的类型错误,请明确键入所需类型的类型转换。当它是.m文件时,这些错误可能不会显示。

答案 11 :(得分:0)

这是常见的错误之一:循环依赖

考虑一个例子:

档案:B.h

#import "A.h"

档案:A.h

#import "C.h"

档案:C.h

#import "B.h"

这引入了循环依赖。

只需将C.h重新声明为:

@class B;

答案 12 :(得分:0)

具体来说,如果您正在编译 NDK C / C ++代码,并且得到:

  

未知类型名称'jclass';你是说“班级”吗?

很有可能包含“ jclass”的文件是eventmachine-ed(直接或间接)在要内置到库中的.c / .cpp文件中。解决方案是:删除该gem install eventmachine --platform ruby