Альтернатива для шаблонов в C ++ - PullRequest
3 голосов
/ 15 февраля 2010

Я написал код, который выглядел следующим образом:

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 ]

5 голосов
/ 15 февраля 2010

Вы уверены, что не можете этого сделать (пробовали)?

Цитата из Центра разработки Mac говорит, что вы не можете объявить Objective-C класс внутри шаблона. Однако вы просто объявляете указатель на объект Objective-C внутри шаблона - совсем другое дело, и я не вижу причины, по которой его нельзя допустить (хотя я никогда не пробовал).

0 голосов
/ 15 февраля 2010

Что не так? Ваш код работает. Мой аналогичный тестовый пример скомпилирован и запущен без утечек.

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...