2010-06-23 19 views
1

Imaginez la classe de modèle suivant (setter et getter pour le membre _t omis):objet modèle en tant que membre statique de la classe de modèle

template<class T> 
class chain 
{ 
public: 
    static chain<T> NONE; 

    chain() 
    : _next(&NONE) 
    {} 

    ~chain() {} 

    chain<T>& getNext() const 
    { 
    return *_next; 
    } 

    void setNext(chain<T>* next) 
    { 
    if(next && next != this) 
     _next = next; 
    } 

    chain<T>& getLast() const 
    { 
    if (_next == &NONE) 
     return *this; 
    else 
     return _next->getLast(); 
    } 

private: 
    T _t; 
    chain<T>* _next; 
}; 

L'idée de base de ce concept est, au lieu d'utiliser null-pointeurs, J'ai un élément statique par défaut qui accepte ce rôle tout en étant un objet techniquement valide; cela pourrait empêcher certains des problèmes avec des pointeurs nuls tout en rendant le code plus bavard en même temps ...

je peux instancier ce modèle très bien, mais l'éditeur de liens donne une non résolue-externe erreur sur l'organe statique objet NONE.

Je suppose que lors de l'instanciation du modèle, la ligne static chain<T> NONE; serait effectivement aussi une définition, comme cela se produit réellement dans l'implémentation en instanciant le modèle. Cependant, il s'avère ne pas être ...

Ma question est: est quelque chose comme possible du tout, et si oui, comment, sans définir explicitement l'élément NONE avant chaque instanciation de modèle?

+0

Je ne pense pas est un produit de nettoyage que l'utilisation un pointeur nul, honnêtement. Remplacez simplement '& NONE' par 0. – GManNickG

Répondre

3

Vous devez toujours définir cela en dehors de la classe, tout comme une classe non-template. Tout comme dans une classe non-modèle, vous avez seulement déclaré NONE dans la définition de la classe et toujours besoin de le définir:

template<class T> 
class chain 
{ 
    // the same as your example 
}; 

// Just add this 
template <class T> 
chain<T> chain<T>::NONE; 
+0

Ah, je vois que vous pouvez réellement définir le membre statique tout en étant modélisé. Cela aurait été compliqué de devoir le faire pour chaque instanciation, mais votre solution est parfaite. – Mephane

2
template < typename T > 
chain<T> chain<T>::NONE; 

devrait fonctionner