2013-05-15 44 views
1

我一直在編碼很長一段時間,但我不明白這個錯誤。我正在編寫一個自定義系統,用於爲特定對象實例提供唯一的整數ID(我稱之爲標籤)。我正在將其中一個類作爲Singleton實現。Singleton類中的無法解析的外部符號

的兩個階層的標籤系統被定義爲這樣的:

#include "singleton.h" 

class Tag: public bear::Singleton<Tag> 
{ 
public: 
    static dUINT32 RequestTag(Tagged* requester); 
    static void RevokeTags(void); 
private: 
    Tag(void); 
    ~Tag(void); 

    Tagged** m_tagTable; // list of all objects with active tags 
    dUINT32 m_tagTable_capacity, // the maximum capacity of the tag table 
      m_tagIndexer; // last given tag 
}; 

class Tagged 
{ 
    friend class Tag; 
public: 
    inline dUINT32 GetTag(void) {return m_tag;} 
private: 
    inline void InvalidateTag(void) {m_tag=INVALID_TAG;} 
    dUINT32 m_tag; 
protected: 
    Tagged(); 
    virtual ~Tagged(); 
}; 

的Singleton類的定義是這樣的:

template <typename T> 
class Singleton 
{ 
public: 
    Singleton(void); 
    virtual ~Singleton(void); 

    inline static T& GetInstance(void) {return (*m_SingletonInstance);} 
private: 
    // copy constructor not implemented on purpose 
    // this prevents copying operations any attempt to copy will yield 
    // a compile time error 
    Singleton(const Singleton<T>& copyfrom); 
protected: 
    static T* m_SingletonInstance; 
}; 

template <typename T> 
Singleton<T>::Singleton (void) 
{ 
    ASSERT(!m_SingletonInstance); 
    m_SingletonInstance=static_cast<T*>(this); 
} 

template <typename T> 
Singleton<T>::~Singleton (void) 
{ 
    if (m_SingletonInstance) 
     m_SingletonInstance= 0; 
} 

我在試圖編譯和鏈接收到以下錯誤在一起的文件:

test.obj:錯誤LNK2001:無法解析的外部符號「protected:static class util :: Tag * b ear :: Singleton :: m_SingletonInstance「(?m_SingletonInstance @?$ Singleton @ VTag @ util @@@ bear @@ 1PAVTag @ util @@ A) 1> C:... \ tools \ Debug \ util.exe:fatal錯誤LNK1120:1個未解決的外部問題

有沒有人有任何想法,爲什麼我得到這個錯誤?

+0

與你的問題沒有直接關係,但我建議看看Scott Meyers的單身模式:http://stackoverflow.com/questions/1661529/is-meyers-implementation-of-singleton-pattern-thread-safe –

回答

2

你應該提供一個定義在命名空間範圍的靜態數據成員(目前,你只有一個聲明):

template <typename T> 
class Singleton 
{ 
    // ... 

protected: 
    static T* m_SingletonInstance; // <== DECLARATION 
}; 

template<typename T> 
T* Singleton<T>::m_SingletonInstance = nullptr; // <== DEFINITION 

如果您正在使用C++ 03的工作,你可以用NULL0代替nullptr

+0

非常感謝。這是第一次奇怪的是,我已經用模板進行了嚴格的編碼,而我完全沒有意識到這一點。 – teddy

+0

雖然只是一個問題。我是否需要在類中聲明每個靜態變量,或者這只是模板特定的細微差別? – teddy

+0

@bear:不客氣:-)如果你需要「定義」,那麼有幾個例外被承認,但大多數是肯定的,你必須在命名空間範圍提供一個定義 –