2010-06-23 276 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; 

應該工作