C++模板類中使用靜態成員變量(例如Singleton模式)
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
一個最簡單Singleton的例子:
///////// Test.h /////////
template <class _T>
class CTest
{
private:
_T n;
static CTest<_T>* m_pInstance; // Notice: static member variable in template class
private:
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 <>”即可。如下:
///////// Test.cpp /////////
#include "Test.h"
template <>
CTest<int>* CTest<int>::m_pInstance = NULL;RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
///////// Test.h /////////
template <class _T>
class CTest
{
private:
_T n;
static CTest<_T>* m_pInstance; // Notice: static member variable in template class
private:
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 <>”即可。如下:
///////// Test.cpp /////////
#include "Test.h"
template <>
CTest<int>* CTest<int>::m_pInstance = NULL;RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成