我想在Objective-C代码中使用C ++字符串对象而不是NSString,所以我不需要转换它(我需要更频繁地使用std :: string)并尝试这样做:< / p>
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
答案 0 :(得分:0)
重要的是包含此头文件的源文件。如果此头文件包含在普通的Objective-C源文件(.m扩展名)中,编译器将按照您的描述进行阻塞。如果您在Xcode中仔细检查错误,您可以确切地看到此头文件无法编译的源文件或文件。
这就是为什么经常建议永远不要在目标C代码使用的头文件中使用C ++对象。头文件中的C ++往往会在你的代码库中流血,迫使你编译所有东西都是Objective C ++(.mm扩展名)。请注意,使用现代运行时和类扩展,可以很容易地解决这个问题。只需移动你的:
@property (nonatomic, assign) string* trackName;
到InstrumentGridViewController.mm文件中的类扩展,并删除现代运行时中不需要的trackName
ivar声明。然后您的标题是Objective C clean,并且可以包含在其余代码中。 Rob Napier在Wrapping C++ Final Edition中对此进行了更多的讨论。
答案 1 :(得分:0)
如果您想将所有内容编译为Obj-c ++并且不想完成更改所有文件扩展名的繁琐过程,只需向编译器提供-x objective-c++
标志(项目设置 - &gt;其他c flags)并与stdlibc ++链接。这样你可以使用c ++所有其他代码而不用担心