一個最簡單Singleton的例子:
///////// Test.h /////////
template <class _T>
class CTest
{
private:
_T n;
static CTest<_T>* m_pInstance; // Notice: static member variable in template class
CTest() { n = 0; }
~CTest() { }
public:
static CTest<_T>* Instance()
if (!m_pInstance)
m_pInstance = new CTest<_T>();
}
return m_pInstance;
void Set(const _T& value) { n = value; }
};
///////// Test.cpp /////////
#include "Test.h"
CTest<int>* CTest<int>::m_pInstance = NULL;
編譯時提示: too few template-parameter-lists,真是莫名其妙的錯誤提示。
在網上找了半天,終于有點眉目了。似乎是應模闆使用是編譯器做的是Lazy Evaluation,就是說隻有當某個模闆類(或者模闆類中的某個函數)需要執行個體化時才執行個體化。也就是說上面這個例子中,編譯器在編譯到Test.cpp裡面的那一句定義語句的時候,發現m_pInstance沒有辦法在整個類執行個體化之前配置設定空間。
解決方法也很簡單,在定義靜态成員變量的那個前面加上“template <>”即可。如下:
template <>