2010-06-23 135 views
1

的静态成员想象以下模板类(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元素之前,每个模板实例化?

+0

我不认为这是比任何清洁剂使用一个空指针,诚实。只需用0替换每个'&NONE'。 – GManNickG 2010-06-23 23:15:36

回答

3

您仍然需要在类之外定义类似非模板类的类。就像在非模板类,你只申报NONE的类定义中,仍然需要定义它:

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

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

啊,我看到你实际上可以定义静态成员,同时仍然是模板化的。如果每个实例都需要这么做,那就太麻烦了,但你的解决方案是完美的。 – Mephane 2010-06-23 23:34:18

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

应该工作