*.mm
的文件并加入#import "AQRecorder.h"
这一行,仍会出现错误"Unknown type name 'class'; did you mean 'Class'?"
和许多其他错误。
根据我的理解,这意味着它不能被识别为C++类。任何帮助将不胜感激。
*.mm
的文件并加入#import "AQRecorder.h"
这一行,仍会出现错误"Unknown type name 'class'; did you mean 'Class'?"
和许多其他错误。
根据我的理解,这意味着它不能被识别为C++类。我刚刚遇到了这个确切的问题。我有一个视图控制器,使用了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++ 风格头文件。
希望这样有所帮助,且易于理解。
这就是当我遇到这个错误时我的导入声明配置情况。在ClassA.h
中:
Import "ClassB.h"
在ClassB.h
文件中:
Import "ClassA.h"
为了修复它,我使用了@class前向声明指令在ClassB.h中前向声明了ClassA(这个指令告诉预编译器ClassA是一个有效的类,并且在编译时会可用)。例如:Import "ClassB.h"
在ClassB.h
中:
@class ClassA;
这修复了未知类型名称 'ClassA'的错误,但也引入了新的错误:ClassB.m
:实例消息的接收器类型 'ClassA'是一个向前声明。 例如:
为了解决这个新错误,我不得不在ClassB(ClassB.m
)的实现文件顶部导入ClassA.h
。现在两个错误都已经解决,我没有任何错误和警告。
例如,现在我有:
在ClassA.h
中:
Import "ClassB.h"
在 ClassB.h
文件中:
@class ClassA;
在ClassB.m
文件中:
Import "ClassA.h"
两个错误消息现在都已解决。
Unknown type name 'class'; did you mean 'Class'?
。换句话说,它似乎将他的C++头文件解释为Obj-C头文件而不是Obj-C++头文件。 - Lily Ballard重要提示:在编译器设置中选择“编译源代码为”变量,并将其值设置为“Objective-C ++”。
看起来这个问题似乎无法解决。 如果可以将 #include "myC++.h" 移到 *.mm 文件中,则可以解决该问题。 但是,如果您需要从 objectiveC.h 文件中使用它,则会失败。 我猜这是苹果公司的一个错误。有一种方法可以指定 *.mm 而不是 *.m, 但没有类似于 *.hh 而不是 *.h 的东西。
具体来说,如果您正在编译NDK C/C++代码,并且出现以下错误:
Unknown type name 'jclass'; did you mean 'class'?
很可能包含“jclass”的文件被直接或间接地#include
在将要构建为库的.c/.cpp文件中。解决方法是:删除该#include
。
从我的经验来看,需要注意以下几点:
在编译器设置中选择“编译源代码为”变量,并将其值设置为“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文件时,这些错误可能不会显示出来。