8
定義考慮下面的結構:C++模板和靜態成員 - 在頭
//! Templated singleton.
/*!
Template wrapper enforcing the singleton behavior.
*/
template <class T>
class TSingleton
{
private:
//! Singleton instance pointer.
static T* instance;
//! private constructor.
TSingleton() { }
//! private empty copy constructor.
TSingleton(const TSingleton<T>& sourceObject) {}
public:
//! Static singleton instance getter.
static T* GetInstance()
{
if (instance == 0)
instance = new T();
return instance;
}
};
template <class T> T* TSingleton<T>::instance = 0;
這個模板類和靜態實例的定義都寫在同一個頭文件。對於非模板類,由於爲實例靜態成員定義了多個符號,因此此會導致鏈接時錯誤。對於模板來說,這似乎也很直觀,因此必須將定義分開並放在.cpp文件中。但模板通常是在類頭文件中聲明和定義的。 這是什麼讓這種語法對模板類有效和功能?
這裏有一個wikipedia鏈接,但它沒有提供關於模板類的情況的明確解釋。