天天看點

C++模闆類中使用靜态成員變量(例如Singleton模式)

一個最簡單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 <>

繼續閱讀