我试图从SpeakHere Apple Xcode项目示例中实现AQRecorder.h类,但即使我将我的实现类重命名为ext。 *.mm
#import "AQRecorder.h"
并且"Unknown type name 'class'; did you mean 'Class'?"
行仍然出现错误{{1}}和其他许多错误。
根据我的意思是它不被认为是C ++类。
任何帮助将不胜感激。
答案 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'吗?错误:
这是我收到此错误时配置导入语句的方式。在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'例如消息是前向声明。 例如:
要解决此新错误,我必须在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)
根据我自己的经验,应该注意以下事项。
在编译器设置中选择“Compile Source As”变量并将其值设置为“Objective-C ++”,即Build Settings-> Apple LLVM 5.1 - Language-> Compile Source As-> Objective-C ++(在Xcode 5.1.1)
将包含C ++头文件的相关文件从.m更改为.mm(有时需要将所有.m更改为.mm)。上面的@Diziet回答了这个问题。
如果您遇到不兼容的类型错误,请明确键入所需类型的类型转换。当它是.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
。