想象一下下面的模板类(_t
省略了成员的 setter 和 getter):
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
在每个模板实例化之前显式定义元素,那么是否有可能?