搞了一個通宵了,百度過很多資料,始終解決不了這個問題。令我開始對C++的繁瑣感到厭倦了。為了編譯通過這麼一個小問題,折騰這麼長時間,真心覺得這種語言繁瑣,刻板,效率低,過時了,讓我這個6年的C++粉開始有點失望……
#ifndef __SINGLETON__H__
#define __SINGLETON__H__
template <typename T>
class Singleton
{
public:
static T* GetInstance()
{
return m_pInstance;
}
protected:
Singleton() {}
~Singleton() {}
private:
Singleton(const Singleton<T> &);
Singleton& operator = (const Singleton<T> &);
static T* m_pInstance;
class Worker // 這裡在類模板中定義了一個內部類
{
public:
Worker()
{
i = 0;
if ( !m_pInstance )
{m_pInstance = new T();printf("ccc\n");}
}
~Worker()
{
if ( m_pInstance )
{delete m_pInstance;printf("ddd\n");}
}
int i;
};
static Worker worker; // 靜態內部類成員,私有的。為了在類模板實例創建時自動調用此靜態內部類的構造函數,銷毀時自動調用此靜態內部類的析構函數
};
template <typename T> T* Singleton<T>::m_pInstance = NULL; // 這句編譯通過
template <typename T> Singleton<T>::Worker Singleton<T>::worker; // 就是這句編譯不通過,糾結了一晚上了,浪費了許多時間,不知道該怎麼寫,求大神們指教。
#define SINGLETON_INIT(Type) friend Type* Singleton<Type>::GetInstance(); private: Type(); ~Type()
#endif
錯誤輸出:
警告 1 warning C4346: “Singleton::Worker”: 依賴名稱不是類型
錯誤 2 error C2143: 語法錯誤 : 缺少“;”(在“Singleton::worker”的前面)
錯誤 3 error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
template <typename T> Singleton<T>::Worker Singleton<T>::worker; // 就是這句編譯不通過,糾結了一晚上了,浪費了許多時間,不知道該怎麼寫,求大神們指教。
加一個typename就能夠通過編譯,改為:
template <typename T> typename Singleton<T>::Worker Singleton<T>::worker;