web-dev-qa-db-ja.com

不明なタイプ名 'class'; 「クラス」という意味ですか?

SpeakHere Apple Xcodeプロジェクトの例からAQRecorder.hクラスを実装しようとしていますが、実装クラスの名前をext。*.mm#import "AQRecorder.h"まだエラーが発生します"Unknown type name 'class'; did you mean 'Class'?"およびその他多数。私によれば、これはC++クラスとして認識されないことを意味します。

任意の助けをいただければ幸いです。

50
Vanya

私はちょうどこの問題を抱えていました。 AQRecorder.mmのAQRecorderクラスを使用するView Controllerがありました。

View ControllerにAQRecorder.hを含めると、これらのエラーが発生しました。私のように見えたのは、私のまっすぐなObjective-C View Controller(.mファイルと名付けられた)に、コンパイラが誤ったエラーをスローしていたC++ヘッダーファイルが含まれていたためです。

2つの解決策があります。最も速いのは、AQRecorder.hを含むView Controllerクラスの名前を.mmファイルに変更することです。私の場合、UIRecorderViewControllerは.mから.mmに変更します。

または、次のものを移動します。

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

AQRecorder.hからAQRecorder.mmへ。これは、まっすぐなC++スタイルのヘッダーファイルが(参照により)プレーンなObj-Cソースに含まれなくなることを意味します。

それが助けになり、理にかなっていることを願っています。

50
Diziet

私の場合、このエラーは2つのクラスの周期的な「インポート」ステートメントが原因で発生しました。各クラスのヘッダーファイルには他のクラスのヘッダーが含まれていたため、不明な型名 'ClassA'; ClassB '?エラー:

enter image description here

これは、このエラーが発生したときにインポートステートメントが構成された方法です。 ClassA.h ::

Import "ClassB.h"

ClassB.h ::

Import "ClassA.h"

それを修正するために、@class前方宣言ディレクティブを使用してClassB.hでClassAを前方宣言します(これにより、プリコンパイラはClassAが有効なクラスであり、コンパイル時に利用できるようになります) 。例えば:

ClassA.h ::

Import "ClassB.h"

ClassB.h ::

@class ClassA;

これにより不明なタイプ名 'ClassA'エラーが修正されましたが、新しいエラーも導入されました:ClassB.mインスタンスメッセージの受信者タイプ 'ClassA'は前方宣言です =例:

enter image description here

この新しいエラーを修正するには、ClassBの実装ファイルの先頭にあるClassA.hClassB.m)をインポートする必要がありました。両方のエラーが解決され、エラーと警告がゼロになりました。

たとえば、私は今持っています:

ClassA.h ::

Import "ClassB.h"

ClassB.h ::

@class ClassA;

ClassB.m ::

Import "ClassA.h"

両方のエラーメッセージが解決されました。

22
Steve HHH

私はあなたと同じエラーに遭遇しました。私の解決策があなたを助けることを願っています。 Xcodeコンパイラは、「*。mm」ファイルでObjective-CおよびC++をコンパイルできます。そのため、「。mm」の接尾辞が付いた「AQRecorder.h」(すべての直接および間接)ファイルをインポートするすべてのファイル名を変更できます。しかし、あなたはそれをしないかもしれません、あなたはSpeakHereControllerとSpeakHereViewControllerの間の関係がいくらかトリッキーであることに気付くかもしれません。 .h "ファイル。私の英語は愚かです、私の答えがあなたの助けになることを願っています。

9
Zhou

重要:コンパイラ設定で「ソースをコンパイル」変数を選択し、その値を「Objective-C++」に設定します。

4
carmin

この問題は解決できないようです。 #include "myC++。h"を* .mmファイルにシフトできる場合、機能します。ただし、objectiveC.hファイルから使用する必要がある場合は失敗します。これはAppleのバグだと思います。 * .mの代わりに* .mmを指定する方法はありますが、*。hの代わりに* .hhに似たものはありません

2
chicha

今日この問題を修正しました。YourHeader.hでC++ * .hファイルまたはC++/OC混合* .hファイルを#includeまたは#importする場合、YourHeader。 mm。そうでない場合、すべてのC++ファイルとC++/OC混合ファイルにコンパイルエラーが表示されます。

1
uspython

XCodeを使用すると、Objective CとC++を混在させることができる「言語」のObjective C++を使用できます。

0
Lindydancer

この問題は、次のビルド設定を変更することで解決できます。

Apple LLVM Compiler 4.2-言語

C++言語方言(Gnu ++ 11が機能します)C++標準ライブラリ(Libc ++が機能します)

Xcodeでファイル拡張子を使用して各ファイルのコンパイル方法を決定する場合は、.mファイルに.mmという名前を付ける必要もあります。

0
Totoro

この問題を次のように解決しました。

元々、ファイルはプロジェクト内に配置されていましたが、正しいファイル構造内には配置されていませんでした。

はい、私はそれが視覚的な問題のためだけであるので実際の構造ではないことを知っていますが、PROJフォルダ内のヘッダーとCPPファイルをすべて動かしたときはうまくいきました。

0
Fallenreaper

私のソリューションはたぶん馬鹿げているように見えますが、xcode 4.2では、

Appleオーディオサンプルコードを追加するために、すべてのファイルを個別に移動しました。

フォルダ全体をドラッグするのではなく、特定のフォルダ内の個々のファイルを1つずつドラッグします。

0
ubaltaci

私自身の経験から、次のことに注意してください。

  1. コンパイラ設定で「ソースをコンパイル」変数を選択し、その値を「Objective-C++」に設定します。つまり、ビルド設定-> Apple LLVM 5.1-言語->ソースをコンパイルAs-> Objective-C++(Xcode 5.1.1)

  2. C++ヘッダーファイルを含む関連ファイルを.mから.mmに変更します(すべての.mを.mmに変更する必要がある場合があります)。これは、上記の@Dizietによって回答されました。

  3. 互換性のない型エラーが発生した場合は、明示的に必要な型の型キャストを実行してください。これらのエラーは、.mファイルの場合には表示されなかった可能性があります。

0
Rajaraman

これはよくある間違いの1つです。循環依存関係

例を考えてみましょう:

ファイル:B.h

#import "A.h"

ファイル:A.h

#import "C.h"

ファイル:C.h

#import "B.h"

これにより、循環依存が導入されます。

C.hで次のように再宣言します。

@class B;
0
Abhilash Gopal