Шаблонный объект как статический член класса шаблона
Вопрос
Представьте себе следующий класс шаблонов (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;
должно сработать