未知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。
从我自己的经验来看,应该注意以下几点。
-
在编译器设置中select“Compile Source As”variables,并将其值设置为“Objective-C ++”,即Build Settings-> Apple LLVM 5.1 – Language-> Compile Source As-> Objective-C ++(在Xcode 5.1.1中)
-
将包含C ++头文件的相关文件从.m更改为.mm(有时您需要将所有.m更改为.mm)。 上面的@Diziet回答了这个问题。
-
如果您遇到不兼容的types错误,请显式执行所需types的types转换。 当它是.m文件时,这些错误可能不会显示出来。
这是一个常见的错误: 循环依赖 。
考虑一个例子:
文件:Bh
#import "Ah"
档案:啊
#import "Ch"
文件:Ch
#import "Bh"
这引入了循环依赖。
在Ch中重新声明如下:
@class B;