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

Van*_*nya 50 c++ objective-c ios5

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

任何帮助将不胜感激.

Diz*_*iet 50

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

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

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

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

#include "CAStreamBasicDescription.h"
#include "CAXException.h"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这个.另外,如果你像我一样需要那些C++头文件来在你的Objective-C类中声明ivars,你可以使用类扩展,如下所示:http://philjordan.eu/article/mixing-objective-c -c ++ - 和目标c ++ (2认同)
  • 您也可以将"文件检查器"中的文件类型更改为"Objective-C++ Source".这与将文件扩展名更改为.mm具有相同的效果 (2认同)

Ste*_*HHH 21

在我的例子中,这个错误是由两个类中的循环"导入"语句引起的:每个类的头文件包含另一个类的标题,导致未知类型名称'ClassA'; 你是说'ClassB'吗?错误:

在此输入图像描述

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

Import "ClassB.h"
Run Code Online (Sandbox Code Playgroud)

ClassB.h:

Import "ClassA.h"
Run Code Online (Sandbox Code Playgroud)

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

ClassA.h:

Import "ClassB.h"
Run Code Online (Sandbox Code Playgroud)

ClassB.h:

@class ClassA;
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

例如,我现在有:

ClassA.h:

Import "ClassB.h"
Run Code Online (Sandbox Code Playgroud)

ClassB.h:

@class ClassA;
Run Code Online (Sandbox Code Playgroud)

ClassB.m:

Import "ClassA.h"
Run Code Online (Sandbox Code Playgroud)

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

  • OP的错误实际上是"Unknown type name"class'; 你的意思是'上课'吗?换句话说,它听起来像是将他的C++头解释为Obj-C头而不是Obj-C++头. (3认同)

Zho*_*hou 9

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