У меня есть проект Какао (приложение Mac OS X), все Objective-C. Я извлек один класс C ++ (который, как я знаю, работает) из другого проекта и создал для него оболочку Objective-C. Класс-обёртка ObjC использует расширение .mm. Однако заголовочный файл C ++ содержит #include
s для стандартных заголовочных файлов C ++ (например, <vector>
), и я получаю ошибки по ним.
Минимальный пример будет выглядеть следующим образом. CppClass - это класс C ++, а CppWrapper - это класс ObjC, который обертывает его.
// CppClass.h
#ifndef _CPP_CLASS_H_
#define _CPP_CLASS_H_
#include <vector>
class CppClass
{
public:
CppClass() {}
~CppClass() {}
private:
std::vector<int> my_ints;
};
#endif /* _CPP_CLASS_H_ */
// CppWrapper.h
#import <Foundation/Foundation.h>
#import "CppClass.h"
@interface CppWrapper : NSObject {
CppClass* myCppClass;
}
@end
// CppWrapper.mm
#import "CppWrapper.h"
@implementation CppWrapper
- (id)init
{
self = [super init];
if (self) {
myCppClass = new CppClass;
}
return self;
}
- (void)dealloc
{
delete myCppClass;
[super dealloc];
}
@end
// The file that uses CppWrapper
// TestAppDelegate.m
#import "TestAppDelegate.h"
#import "CppWrapper.h"
@implementation TestAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
myWrapper = [[CppWrapper alloc] init];
}
@end
Я получаю ошибку #include
из vector
в CppClass.h. Ошибка
Проблема лексического или препроцессора: 'vector'
файл не найден
Этот код отлично работает в другом (все C ++) проекте, так что я почти уверен, что это настройка сборки или что-то я сделал неправильно в классе-оболочке. Я использую Xcode 4. Я создал проект приложения Mac OS по умолчанию, и все настройки по умолчанию.
Обновление : Я только что понял, что, если я устанавливаю Тип файла TestAppDelegate в Objective-C ++ (или переименовываю его в TestAppDelegate.mm), это работает. Что я не понимаю, так это то, что этот класс - чистый Objective-C; почему он должен быть скомпилирован как Objective-C ++? Весь смысл наличия оболочки Objective-C в моем классе C ++ состоит в том, что мне не нужно создавать весь проект как Objective-C ++.