Unknown type name 'class'; did you mean 'Class'?
In my case, this error was caused by cyclical "Import" statements in two classes: the header file for each class included the header of the other class, resulting in the Unknown type name 'ClassA'; did you mean 'ClassB'? error:
This is how my import statements were configured when I got this error. In ClassA.h
:
Import "ClassB.h"
In ClassB.h
:
Import "ClassA.h"
To fix it, I used the @class
forward declaration directive to forward-declare ClassA in ClassB.h
(this promises the pre-compiler that ClassA is a valid class, and that it will be available at compile time). For example:
In ClassA.h
:
Import "ClassB.h"
In ClassB.h
:
@class ClassA;
This fixed the Unknown type name 'ClassA' error, but also introduced a new error: ClassB.m
: Receiver type 'ClassA' for instance message is a forward declaration. For example:
To fix this new error, I had to import ClassA.h
at the top of the implementation file of ClassB (ClassB.m
). Both errors are now resolved, and I get zero errors and warnings.
For example, I now have:
In ClassA.h
:
Import "ClassB.h"
In ClassB.h
:
@class ClassA;
In ClassB.m
:
Import "ClassA.h"
Both error messages are now resolved.
I've just had this exact problem. I had a view controller using the AQRecorder class from AQRecorder.mm.
When I included AQRecorder.h in my view controller these errors occurred. It appeared to me because my straight objective-c view controller (named as a .m file) was including C++ header files the compiler was throwing spurious errors.
There are two solutions. The quickest is to rename the view controller class including AQRecorder.h to be a .mm file, in my case UIRecorderViewController from .m to .mm.
Or, move the following includes:
#include "CAStreamBasicDescription.h"
#include "CAXException.h"
Out of AQRecorder.h into AQRecorder.mm. This means that straight C++ style header files will no longer be included (by reference) in your plain Obj-C source.
Hope that helps, and makes sense.