2010-02-15 5 views
3

J'écrit le code qui ressemblait à ce qui suit:Alternative pour les modèles en C++

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

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

    // ... 
}; 

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

Mais cela ne fonctionne pas, parce que Mac Dev Center dit:

classes Objective-C, les protocoles, et catégories ne peuvent pas être déclarés dans un C++ modèle

Alors que dois-je faire maintenant mieux?

+0

Pourquoi insistez-vous sur l'utilisation de C++? – zoul

+0

Parce que je veux un wrapper C++ pour certaines classes de cacao. –

Répondre

5

Etes-vous sûr de ne pas pouvoir le faire (avez-vous essayé)? La citation de Mac Dev Center indique que vous ne pouvez pas déclarer une classe Objective-C dans un modèle. Ce que vous faites, cependant, est simplement de déclarer un pointeur à un objet Objective-C à l'intérieur d'un modèle - une chose assez différente, et je ne vois pas pourquoi cela ne devrait pas être autorisé (même si j'ai jamais essayé).

+0

Je pense, vous avez raison. J'ai testé l'exemple simplifié et il compile. Je viens d'obtenir le widget «utilisation invalide de type incomplet» '' donc je pensais que ce serait le problème. Donc, probablement, l'erreur est nulle part ailleurs. Merci quand même! –

+0

@Niels: Si vous obtenez ce message d'erreur, le problème est probablement que vous n'incluez pas le fichier d'en-tête avec la définition de votre classe de modèle 'Widget '. –

+0

Non. J'ai juste oublié n'importe où un crochet de fermeture. Je l'ai résolu non (Pourquoi ne pas gcc juste dire que j'ai oublié une fermeture} ??? –

0

Qu'est-ce qui ne va pas? Votre code fonctionne. Mon cas de test similaire compilé et exécuté sans fuites.

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