代码之家  ›  专栏  ›  技术社区  ›  Karl von Moor

C++中模板的替代

  •  3
  • Karl von Moor  · 技术社区  · 14 年前

    我编写了如下代码:

    template<typename CocoaWidget>
    class Widget : boost::noncopyable
    {
    private:
      CocoaWidget* mCocoaWidget;
    
    public:
      Widget()
      {
        mCocoaWidget = [[CocoaWidget alloc] init];
      }
    
      // ...
    };
    
    class Button : Widget<NSButton>
    {
      // ...
    };
    

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

    目标C类、协议和 类别不能在 C++模板

    那么我现在该怎么办呢?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Martin B    14 年前

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

    来自mac dev center的引用说你不能声明一个objective-c 在模板内。但是,您所做的只是声明 指向Objective-C对象的指针 在一个模板中——完全不同的东西,我不明白为什么不允许这样做(尽管我从未尝试过)。

        2
  •  0
  •   kennytm    14 年前

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

    #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;
    }