与类模板的成员函数的非内联定义一样,类模板的static类型的数据成员需要使用外层模板的声明方式来初始化。

例子

template <typename T>
class CSingleton
{
public:
    static T* Instance()
    {
        Lock::CLockWrapper guard(CriticalSection_);
        if (m_instance == NULL)
        {
            m_instance = new T;
        }
        
        ASSERT(m_instance != NULL);
        
        return m_instance;
    };
    
    static void DestroyInstance()
    {
        Lock::CLockWrapper guard(CriticalSection_);
        if (m_instance)
            delete m_instance;
        m_instance = NULL;
    };
 
protected:
    CSingleton()
    {
    };
 
    virtual ~CSingleton()
    {
    };
 
private:
    CSingleton(const CSingleton& source)
    {
    };
 
    static T* m_instance;
    static Lock::CCriticalSectionWrapper CriticalSection_;
};
 
template <typename T>
Lock::CCriticalSectionWrapper CSingleton<T>::CriticalSection_;
 
// 类模板的静态成员初始化语法
template <typename T> 
T* CSingleton<T>::m_instance = NULL;