webentwicklung-frage-antwort-db.com.de

Unbekannter Typname 'Klasse'; Meinten Sie „Klasse“?

Ich versuche, die Klasse AQRecorder.h aus SpeakHere Apple Xcode-Projektbeispiel) zu implementieren, benenne aber meine Implementierungsklasse in ext. *.mm Um und setze die Zeile mit #import "AQRecorder.h" immer noch Fehler "Unknown type name 'class'; did you mean 'Class'?" und viele andere, was meiner Meinung nach bedeutet, dass es nicht als C++ - Klasse erkannt wird.

Jede Hilfe wird geschätzt.

50
Vanya

Ich hatte gerade genau dieses Problem. Ich hatte einen View Controller mit der AQRecorder-Klasse von AQRecorder.mm.

Beim Einfügen von AQRecorder.h in meinen Ansichtscontroller sind diese Fehler aufgetreten. Es schien mir, weil mein direkter Objective-C-View-Controller (benannt als .m-Datei) C++ - Header-Dateien enthielt, die der Compiler fehlerhaft auslöste.

Es gibt zwei Lösungen. Am schnellsten ist es, die View-Controller-Klasse einschließlich AQRecorder.h in eine .mm-Datei umzubenennen, in meinem Fall UIRecorderViewController von .m in .mm.

Oder verschieben Sie die folgenden Elemente:

#include "CAStreamBasicDescription.h"
#include "CAXException.h"

Aus AQRecorder.h in AQRecorder.mm. Dies bedeutet, dass gerade C++ - Header-Dateien nicht mehr (als Referenz) in Ihrer reinen Obj-C-Quelle enthalten sind.

Hoffe das hilft und macht Sinn.

50
Diziet

In meinem Fall wurde dieser Fehler durch zyklische "Import" -Anweisungen in zwei Klassen verursacht: Die Headerdatei für jede Klasse enthielt den Header der anderen Klasse, was zu nbekannter Typname 'ClassA'; meintest du ' ClassB '? Fehler:

enter image description here

So wurden meine Importanweisungen konfiguriert, als ich diesen Fehler erhielt. In ClassA.h:

Import "ClassB.h"

In ClassB.h:

Import "ClassA.h"

Um das Problem zu beheben, habe ich die Forward-Deklarationsanweisung @class Verwendet, um ClassA in ClassB.h Weiterzudeklarieren (dies verspricht dem Pre-Compiler, dass ClassA eine gültige Klasse ist und beim Kompilieren verfügbar sein wird Zeit). Beispielsweise:

In ClassA.h:

Import "ClassB.h"

In ClassB.h:

@class ClassA;

Dies behebt den nbekannter Typname 'ClassA' Fehler, führt aber auch einen neuen Fehler ein: ClassB.m: Empfängertyp 'ClassA' zum Beispiel Nachricht ist eine Vorwärtsdeklaration. Zum Beispiel:

enter image description here

Um diesen neuen Fehler zu beheben, musste ich ClassA.h Oben in die Implementierungsdatei von ClassB (ClassB.m) Importieren. Beide Fehler sind jetzt behoben und ich erhalte keine Fehler und Warnungen.

Zum Beispiel habe ich jetzt:

In ClassA.h:

Import "ClassB.h"

In ClassB.h:

@class ClassA;

In ClassB.m:

Import "ClassA.h"

Beide Fehlermeldungen sind nun behoben.

22
Steve HHH

ich bin auf den gleichen Fehler bei Ihnen gestoßen, hoffe, meine Lösung kann Ihnen helfen. Der Xcode-Compiler könnte Objective-C & C++ in der "* .mm" -Datei kompilieren, so dass Sie alle Ihre Dateinamen ändern können, die "AQRecorder.h" (alle direkt und indirekt) -Dateien mit ".mm" -Postfix importieren. Aber Sie können das nicht tun, Sie können feststellen, dass die Beziehung zwischen SpeakHereController und SpeakHereViewController einige knifflige ist, ich habe gerade gelernt, wie er es verwendet, dass das SpeakHereController-Objekt in einer Nib-Datei erstellen, so SpeakHereViewController-Datei muss nicht den "AQRecorder" importieren .h "Datei. Mein Englisch ist dumm, ich hoffe, meine Antwort kann Ihnen helfen.

9
Zhou

WICHTIG: Wählen Sie in den Compilereinstellungen die Variable "Compile Source As" und setzen Sie den Wert auf "Objective-C++".

4
carmin

Es sieht so aus, als wäre dieses Problem nicht zu lösen. Wenn es möglich ist, #include "myC++. H" in eine * .mm-Datei zu verschieben, funktioniert es. Wenn Sie es jedoch aus Ihrer Datei "objectC.h" verwenden müssen, schlägt dies fehl. Ich denke, das ist ein Fehler von Apple. Es gibt eine Möglichkeit, * .mm anstelle von * .m anzugeben, aber es gibt nichts Ähnliches wie * .hh anstelle von * .h

2
chicha

Ich habe dieses Problem heute behoben. Wenn Sie eine C++ * .h-Datei oder eine C++/OC-gemischte * .h-Datei in YourHeader.h einschließen oder importieren, MÜSSEN Sie ein YourHeader) haben. mm. Wenn nicht, werden in allen C++ - und C++/OC-gemischten Dateien Kompilierungsfehler angezeigt.

1
uspython

Mit XCode ist es möglich, die "Sprache" Objective C++ zu verwenden, mit der Sie Objective C und C++ mischen können.

0
Lindydancer

Dieses Problem kann durch Ändern der folgenden Buildeinstellungen behoben werden:

Unter Apple LLVM Compiler 4.2 - Sprache

C++ - Sprachdialekt (Gnu ++ 11 funktioniert bei mir) C++ - Standardbibliothek (Libc ++ funktioniert bei mir)

Es ist auch notwendig, die .m-Dateien als .mm zu bezeichnen, wenn Sie Xcode die Dateierweiterung verwenden lassen, um zu entscheiden, wie die einzelnen Dateien kompiliert werden sollen.

0
Totoro

Ich habe dieses Problem folgendermaßen gelöst:

Ursprünglich wurden die Dateien im Projekt platziert, jedoch nicht in der richtigen Dateistruktur.

JA, mir ist bewusst, dass es sich nicht um eine tatsächliche Struktur handelt, da es sich nur um visuelle Probleme handelt, ABER als ich den Header und die CPP-Datei innerhalb des PROJ-Ordners verschoben habe, hat alles funktioniert.

0
Fallenreaper

Meine Lösung sieht vielleicht lächerlich aus, aber in xcode 4.2,

Um Apple Audio-Beispielcodes hinzuzufügen, habe ich alle Dateien einzeln verschoben, und es funktioniert wie ein Zauber!

Ich meine, nicht den ganzen Ordner zu ziehen, sondern alle einzelnen Dateien einzeln in einen bestimmten Ordner zu ziehen.

0
ubaltaci

Nach meiner eigenen Erfahrung sollten folgende Dinge beachtet werden.

  1. Wählen Sie in den Compilereinstellungen die Variable "Compile Source As" und setzen Sie ihren Wert auf "Objective-C++", d. H. Build Settings-> Apple LLVM 5.1 - Sprache-> Compile Source As-> Objective-C++ (in Xcode 5.1.1).

  2. Ändern Sie die relevanten Dateien, die eine C++ - Headerdatei enthalten, von .m in .mm (manchmal müssen Sie alle .m in .mm ändern). Dies wurde von @Diziet oben beantwortet.

  3. Wenn Sie auf inkompatible Typfehler stoßen, führen Sie explizit eine Typumwandlung des erforderlichen Typs durch. Diese Fehler wurden möglicherweise nicht angezeigt, als es sich um eine M-Datei handelte.

0
Rajaraman

Dies ist einer der häufigsten Fehler: Kreisförmige Abhängigkeiten.

Betrachten Sie ein Beispiel:

Datei: B.h.

#import "A.h"

Datei: A.h.

#import "C.h"

Datei: C.h.

#import "B.h"

Dies führt die Kreisabhängigkeit ein.

Einfach in C.h neu deklarieren als:

@class B;
0
Abhilash Gopal