Шаблонный объект как статический член класса шаблона

StackOverflow https://stackoverflow.com/questions/3106206

  •  29-09-2019
  •  | 
  •  

Вопрос

Представьте себе следующий класс шаблонов (Setter и Getter для участника _t опущен):

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

Основная идея этой концепции заключается в том, чтобы использовать нулевые указатели, у меня есть статический элемент по умолчанию, который принимает эту роль, оставаясь технически достоверным объектом; Это может предотвратить некоторые проблемы с нулевыми указателями, одновременно делая код более многословным ...

Я могу создать экземпляр этого шаблона просто отлично, но линкер дает неразрешенные Ошибка на статическом объекте члена NONE.

Я бы предположил, что при создании шаблона, линия static chain<T> NONE; эффективно также будет определением, так как это действительно происходит в рамках реализации, создавающей шаблон. Тем не менее, оказывается не быть ...

Мой вопрос: это что -то вроде возможно, и если да, то, как, без явного определения NONE Элемент перед каждым шаблоном экземпляра?

Это было полезно?

Решение

Вам все еще нужно определить это за пределами класса, как класс, не отображаемый. Как и в классе, не относящемся NONE Внутри определения класса и все еще нужно определить его:

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

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

Другие советы

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

должно сработать

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top