Domanda

Immaginate la seguente classe di template (setter e getter per la _t membro omesso):

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'idea di base di questo concetto è, invece di utilizzare nulli punti, ho un elemento predefinito statico che prende in questo ruolo, pur essendo un oggetto tecnicamente valida; questo potrebbe prevenire alcuni dei problemi con i puntatori nulli rendendo il codice più prolisso, allo stesso tempo ...

Posso un'istanza di questo modello bene, ma il linker dà una irrisolto-esterno di errore sul NONE oggetto membro statico.

I avrebbe assunto che quando un'istanza del modello, la linea static chain<T> NONE; potrebbe effettivamente essere una definizione, anche, come effettivamente avviene all'interno all'attuazione un'istanza modello. Tuttavia, si scopre non essere ...

La mia domanda è: è qualcosa di simile possibile a tutti, e se sì, come, senza definire in modo esplicito l'elemento NONE prima di ciascun modello di un'istanza

?
È stato utile?

Soluzione

È ancora necessario definire che al di fuori della classe, proprio come una classe non-template. Proprio come in una classe non-template, si è dichiarato solo NONE all'interno della definizione di classe e ancora bisogno di definirlo:

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

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

Altri suggerimenti

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

dovrebbe funzionare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top