在Cocoa项目中使用C++类时找不到标准C++包含

zpa*_*ack 8 c++ cocoa objective-c wrapper

我有一个Cocoa项目(Mac OS X应用程序),所有Objective-C.我从另一个项目中引入了一个C++类(我知道它可以工作),然后为它创建一个Objective-C包装器.ObjC包装器类使用.mm扩展名.但是,C++头文件包含#include标准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
Run Code Online (Sandbox Code Playgroud)

我得到的错误是对#include的vector在CppClass.h.错误是

词法或预处理器问题:'vector'找不到文件

这段代码在另一个(所有C++)项目中工作得很好,所以我很确定它是一个构建设置,或者我在包装类中做错了.我正在使用Xcode 4.我创建了一个默认的Cocoa Mac OS应用程序项目,所有设置都是默认设置.

更新:我刚刚意识到如果我将TestAppDelegate的文件类型设置为Objective-C++(或将其重命名为TestAppDelegate.mm),它就可以工作.我不明白的是,这个类是纯粹的Objective-C; 为什么必须编译为Objective-C++?在我的C++类上使用Objective-C包装器的全部意义在于我不必将整个项目构建为Objective-C++.

NSG*_*God 13

您的CppWrapper类的问题是它不提供纯Objective-C接口.在您的CppWrapper.h文件中,您正在导入C++类的头文件,这意味着任何导入包装类的Objective-C类都需要编译为Objective-C++,包括您的TestAppDelegate.

相反,你需要做这样的事情来完全隐藏CppWrapper.mm文件中的C++ :

//  CppWrapper.h
#import <Foundation/Foundation.h>

@interface CppWrapper : NSObject {
    void *myCppClass;
}
- (void)doSomethingWithCppClass;
@end


//  CppWrapper.mm
#import "CppWrapper.h"
#import "CppClass.h"

@implementation CppWrapper

- (id)init {
    self = [super init];
    if (self) {
        myCppClass = new CppClass;
    }    
    return self;
}

- (void)dealloc {
    delete myCppClass;
    [super dealloc];
}

- (void)doSomethingWithCppClass {
   static_cast<CppClass *>(myCppClass)->DoSomething();
}

@end
Run Code Online (Sandbox Code Playgroud)