Представьте себе следующий класс шаблона (сеттер и геттер для члена _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;
};
Основная идея этой концепции заключается в том, что вместо использования нулевых указателей у меня есть статический элемент по умолчанию, который берет на себя эту роль, оставаясь при этом технически допустимым объектом; это может предотвратить некоторые проблемы с нулевыми указателями, одновременно делая код более подробным...
Я могу прекрасно создать экземпляр этого шаблона, но компоновщик выдает ошибку unresolved-external для статического объекта-члена NONE
.
Я бы предположил, что при создании экземпляра шаблона строка static chain<T> NONE
; фактически также будет определением, поскольку это фактически происходит в реализации, создающей экземпляр шаблона. Однако оказывается, что нет...
Мой вопрос: возможно ли вообще что-то подобное, и если да, то как, без явного определения элемента NONE
перед каждым созданием шаблона?
&NONE
на 0. - person GManNickG   schedule 24.06.2010