未知types名称“class”; 你是不是指“class”?

我试图从SpeakHere苹果Xcode项目示例实现AQRecorder.h类,但即使我重命名我的实现类到分机。 *.mm并放置#import "AQRecorder.h"仍然出现错误"Unknown type name 'class'; did you mean 'Class'?" 和其他许多人。 根据我的意思是它不被认为是C ++类。

任何帮助将不胜感激。

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

当我在视图控制器中包含AQRecorder.h时,发生了这些错误。 在我看来,因为我的直观的Objective-C视图控制器(命名为.m文件)包括C ++头文件编译器投掷虚假错误。

有两个解决scheme。 最快的方法是将包含AQRecorder.h的视图控制器类重命名为.mm文件,在我的情况下,将UIRecorderViewController从.m重命名为.mm。

或者,移动下面包括:

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

出AQRecorder.h到AQRecorder.mm。 这意味着直接的C ++风格的头文件将不再包含在您的普通Obj-C源代码中(通过引用)。

希望有所帮助,而且是有道理的。

在我的情况下,这个错误是由两个类中的循环“Import”语句引起的:每个类的头文件包含另一个类的头,导致Unknowntypes名称为“ClassA”。 你是不是指“ClassB”? 错误:

在这里输入图像说明

这是我得到这个错误时如何configuration我的导入语句。 在ClassA.h

 Import "ClassB.h" 

ClassB.h

 Import "ClassA.h" 

为了解决这个问题,我使用了@class forward声明指令来在ClassB.h转发声明ClassA(这ClassB.h着预编译器的ClassA是一个有效的类,并且它将在编译时可用)。 例如:

ClassA.h

 Import "ClassB.h" 

ClassB.h

 @class ClassA; 

这固定了未知types名称“ClassA”的错误,但也引入了一个新的错误: ClassB.m接收者types“ClassA”,例如消息是前向声明。 例如:

在这里输入图像说明

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

例如,我现在有:

ClassA.h

 Import "ClassB.h" 

ClassB.h

 @class ClassA; 

ClassB.m

 Import "ClassA.h" 

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

我遇到了同样的错误,希望我的解决scheme可以帮助你。 Xcode编译器可以在“* .mm”文件中编译objective-c和c ++,所以你可以改变你所有的文件名,这个文件名用“.mm”后缀导入“AQRecorder.h”(所有直接和间接)文件。 但是你可能不会那样做,你可能会发现SpeakHereController和SpeakHereViewController之间的关系有些棘手,我刚刚学会了如何使用它,在一个nib文件中创buildSpeakHereController对象,所以SpeakHereViewController文件不需要导入“AQRecorder .h“文件。 我的英文很愚蠢,我希望我的回答可以帮助你。

重要提示:在编译器设置中select“编译源代码”variables,并将其值设置为“Objective-C ++”。

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

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

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

我的解决scheme可能看起来嘲笑,但在Xcode 4.2,

要添加Appleaudio示例代码,我单独移动了所有文件,并将其用作魅力!

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

我解决了这个问题如下:

最初,这些文件被放置在项目中,但不在正确的文件结构中。

是的,我知道这不是一个实际的结构,因为它只是为视觉问题,但是当我移动标题和PROJ文件夹内的CPP文件都工作。

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

在苹果LLVM编译器4.2下 – 语言

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

如果您让Xcode使用文件扩展名来决定如何编译每个文件,那么也需要将.m文件命名为.mm。

从我自己的经验来看,应该注意以下几点。

  1. 在编译器设置中select“Compile Source As”variables,并将其值设置为“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. 如果您遇到不兼容的types错误,请显式执行所需types的types转换。 当它是.m文件时,这些错误可能不会显示出来。

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

考虑一个例子:

文件:Bh

 #import "Ah" 

档案:啊

 #import "Ch" 

文件:Ch

 #import "Bh" 

这引入了循环依赖。

在Ch中重新声明如下:

 @class B;