web-dev-qa-db-fra.com

Nom de type inconnu «classe»; vouliez-vous dire "classe"?

J'essaie d'implémenter la classe AQRecorder.h à partir de SpeakHere Apple Xcode, mais même je renomme ma classe d'implémentation en ext. *.mm et mettre en ligne avec #import "AQRecorder.h" toujours une erreur "Unknown type name 'class'; did you mean 'Class'?" et plein d'autres. Ce qui selon moi signifie qu'il n'est pas reconnu comme classe C++.

Toute aide serait appréciée.

50
Vanya

Je viens d'avoir ce problème exact. J'avais un contrôleur de vue utilisant la classe AQRecorder de AQRecorder.mm.

Lorsque j'ai inclus AQRecorder.h dans mon contrôleur de vue, ces erreurs se sont produites. Cela m'est apparu parce que mon contrôleur de vue objectif-c droit (nommé en tant que fichier .m) incluait des fichiers d'en-tête C++ que le compilateur lançait de fausses erreurs.

Il y a deux solutions. Le plus rapide consiste à renommer la classe du contrôleur de vue, y compris AQRecorder.h, en fichier .mm, dans mon cas, UIRecorderViewController de .m à .mm.

Ou déplacez les éléments suivants:

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

De AQRecorder.h dans AQRecorder.mm. Cela signifie que les fichiers d'en-tête de style C++ ne seront plus inclus (par référence) dans votre source Obj-C standard.

J'espère que cela aide et fait sens.

50
Diziet

Dans mon cas, cette erreur a été provoquée par des instructions cycliques "Import" dans deux classes: le fichier d'en-tête pour chaque classe comprenait l'en-tête de l'autre classe, ce qui a entraîné le nom de type inconnu 'ClassA'; vouliez-vous dire ' ClasseB '? erreur:

enter image description here

C'est ainsi que mes instructions d'importation ont été configurées lorsque j'ai eu cette erreur. Dans ClassA.h:

Import "ClassB.h"

Dans ClassB.h:

Import "ClassA.h"

Pour le réparer, j'ai utilisé le @class directive de déclaration avancée pour déclarer en amont la classe A dans ClassB.h (cela promet au précompilateur que ClassA est une classe valide et qu'elle sera disponible au moment de la compilation). Par exemple:

Dans ClassA.h:

Import "ClassB.h"

Dans ClassB.h:

@class ClassA;

Cela a corrigé l'erreur nom de type inconnu 'ClassA', mais a également introduit une nouvelle erreur: ClassB.m: Le type de récepteur 'ClassA' pour le message d'instance est une déclaration directe. Par exemple:

enter image description here

Pour corriger cette nouvelle erreur, j'ai dû importer ClassA.h en haut du fichier d'implémentation de ClassB (ClassB.m). Les deux erreurs sont maintenant résolues et je ne reçois aucune erreur ni aucun avertissement.

Par exemple, j'ai maintenant:

Dans ClassA.h:

Import "ClassB.h"

Dans ClassB.h:

@class ClassA;

Dans ClassB.m:

Import "ClassA.h"

Les deux messages d'erreur sont maintenant résolus.

22
Steve HHH

j'ai rencontré la même erreur avec vous, j'espère que ma solution peut vous aider. Le compilateur Xcode peut compiler objective-c & c ++ dans le fichier "* .mm", vous pouvez donc changer tout votre nom de fichier qui importe le fichier "AQRecorder.h" (tous directs et indirects) avec le suffixe ".mm". Mais vous ne pouvez pas le faire, vous pouvez constater que la relation entre SpeakHereController et SpeakHereViewController est quelque peu délicate, je viens d'apprendre comment il l'a utilisé, qui crée l'objet SpeakHereController dans un fichier nib, donc le fichier SpeakHereViewController n'est pas obligé d'importer le "AQRecorder .h ". mon anglais est stupide, j'espère que ma réponse pourra vous aider.

9
Zhou

IMPORTANT: sélectionnez la variable "Compiler la source sous" dans les paramètres du compilateur et définissez sa valeur sur "Objective-C++".

4
carmin

Il semble que ce problème soit impossible à résoudre. S'il est possible de déplacer #include "myC++. H" dans un fichier * .mm alors cela fonctionne. Mais si vous devez l'utiliser à partir de votre fichier objectiveC.h, il échoue. Je suppose que c'est un bug d'Apple. Il existe un moyen de spécifier * .mm au lieu de * .m mais il n'y a rien de similaire à * .hh au lieu de * .h

2
chicha

J'ai résolu ce problème aujourd'hui.Si vous #incluez ou #importez un fichier C++ * .h ou un fichier C++/OC mixte * .h dans YourHeader.h, vous DEVEZ avoir un YourHeader. mm. Sinon, tous vos fichiers C++ et mixtes C++/OC afficheront des erreurs de compilation.

1
uspython

En utilisant XCode, il est possible d'utiliser l'Objective C++ "langage", qui permet de mélanger Objective C et C++.

0
Lindydancer

Ce problème peut être résolu en modifiant les paramètres de génération suivants:

Sous Apple LLVM Compiler 4.2 - Langue

Dialecte du langage C++ (Gnu ++ 11 fonctionne pour moi) Bibliothèque standard C++ (Libc ++ fonctionne pour moi)

Il est également nécessaire de nommer les fichiers .m en tant que .mm, si vous laissez Xcode utiliser l'extension de fichier pour décider comment compiler chaque fichier.

0
Totoro

J'ai résolu ce problème comme suit:

À l'origine, les fichiers étaient placés dans le projet, mais pas dans la structure de fichiers correcte.

OUI, je suis conscient que ce n'est pas une structure réelle car ce n'est que pour des problèmes visuels, MAIS quand j'ai déplacé l'en-tête et le fichier CPP dans le dossier PROJ, tout a fonctionné.

0
Fallenreaper

Ma solution semble peut-être ridicule, mais dans xcode 4.2,

Pour ajouter Apple Exemples de codes audio, j'ai déplacé tous les fichiers individuellement, et cela fonctionne comme un charme!

Je ne veux pas faire glisser un dossier entier, faites glisser un par un tous les fichiers individuels dans un dossier spécifique.

0
ubaltaci

D'après ma propre expérience, les choses suivantes doivent être prises en compte.

  1. Sélectionnez la variable "Compiler la source sous" dans les paramètres du compilateur et définissez sa valeur sur "Objective-C++", c'est-à-dire les paramètres de construction-> Apple LLVM 5.1 - Langue-> Compiler la source sous-> Objective-C++ (dans Xcode 5.1.1)

  2. Changez les fichiers appropriés qui incluent un fichier d'en-tête C++ de .m en .mm (parfois vous devez changer tous les .m en .mm). @Diziet a répondu ci-dessus.

  3. Si vous rencontrez des erreurs de type incompatibles, effectuez explicitement la conversion de type du type requis. Ces erreurs peuvent ne pas être apparues lorsqu'il s'agissait du fichier .m.

0
Rajaraman

C'est l'une des erreurs les plus courantes: dépendances circulaires.

Prenons un exemple:

Fichier: B.h

#import "A.h"

Fichier: A.h

#import "C.h"

Fichier: C.h

#import "B.h"

Cela introduit une dépendance circulaire.

Redéclarez simplement en C.h comme:

@class B;
0
Abhilash Gopal