0

NSString の代わりに Objective-C コードで C++ 文字列オブジェクトを使用したいので、それを変換する必要はありません (std::string がより頻繁に必要です)。次のようにしてみました:

using namespace std;

@interface InstrumentGridViewController : UIViewController {   
string* trackName; // also tried using std::string, didn't work
@property (nonatomic, assign) string* trackName;
}

string* trackName;ただし、ステートメントと@property行の両方でエラーが発生しますExpected specifier-qualifier-list 'string'

編集:追加するのを忘れまし#include <string>たが、これを追加するとエラーが発生しますString: no such file or directory

4

2 に答える 2

0

重要なのは、このヘッダー ファイルがインクルードされるソース ファイルです。このヘッダー ファイルが通常の Objective-C ソース ファイル (.m 拡張子) に含まれている場合、コンパイラは説明どおりにチョークします。Xcode でエラーを注意深く確認すると、このヘッダー ファイルがコンパイルに失敗したソース ファイルを正確に確認できます。

これが、Objective C コードによって使用されることを意図したヘッダー ファイルで C++ オブジェクトを使用しないことがしばしば推奨される理由です。ヘッダー ファイルの C++ は、コード ベース全体に影響を与える傾向があり、Objective C++ (.mm 拡張子) のすべてをコンパイルする必要があります。最新のランタイムとクラスの拡張機能を使用すると、これを簡単に回避できることに注意してください。移動するだけです:

@property (nonatomic, assign) string* trackName;

InstrumentGridViewController.mm ファイルのクラス拡張に追加しtrackName、最新のランタイムでは不要な ivar 宣言を削除します。その後、ヘッダーは Objective C でクリーンになり、コードの残りの部分に含めることができます。Rob Napier がWrapping C++ Final Editionでこれについてさらに議論しています。

于 2012-07-24T23:01:02.673 に答える
0

すべてを Obj-c++ としてコンパイルし、すべてのファイル拡張子を変更する面倒なプロセスを経たくない場合は、-x objective-c++フラグをコンパイラに提供し (プロジェクト設定 -> 他の c フラグ)、stdlibc++ とリンクします。そうすれば、心配することなく、他のすべてのコードを C++ で使用できます。

于 2012-07-25T16:48:52.790 に答える