替代C ++中的模板

时间:2010-02-15 09:48:02

标签: c++ objective-c templates

我编写的代码如下所示:

template<typename CocoaWidget>
class Widget : boost::noncopyable
{
private:
  CocoaWidget* mCocoaWidget;

public:
  Widget()
  {
    mCocoaWidget = [[CocoaWidget alloc] init];
  }

  // ...
};

class Button : Widget<NSButton>
{
  // ...
};

但这不起作用,因为Mac Dev Center说:

  

Objective-C类,协议和   类别不能在一个内部声明   C ++模板

那么我现在最好做什么呢?

2 个答案:

答案 0 :(得分:5)

你确定你不能这样做(你试过吗)?

Mac Dev Center的引用说你不能在模板中声明Objective-C 。但是,你所做的只是在模板中声明一个指向Objective-C对象指针 - 这是一个完全不同的东西,我没有看到为什么它不应该是允许(虽然我从未尝试过)。

答案 1 :(得分:0)

怎么了?你的代码正在运行。我的类似测试用例编译并运行时没有泄漏。

#import <Foundation/Foundation.h>

template <typename T>
class U {
protected:
        T* a;
public:
        U() { a = [[T alloc] init]; }
        ~U() { [a release]; }
};

class V : U<NSMutableString> {
public:
        V(int i) : U<NSMutableString>() { [a appendFormat:@"%d = 0x%x\n", i, i]; }
        void print() const { NSLog(@"%@", a); }
};

int main() {
        U<NSAutoreleasePool> p;
        V s(16);
        s.print();
        return 0;
}