C++模板類中靜態資料成員初始化
阿新 • • 發佈:2018-12-11
首先看程式碼,靜態資料成員分為兩種情況,第一種不依賴模版型別引數,第二種依賴模版型別引數。
- template <typename T> class TestTemStatic
- {
- public:
- static int knownTypeVar;
- static T unKnownTypeVar;
- };
那麼如何初始化呢?
對於第一種存在兩種初始化方式:
- template <> int TestTemStatic<int/* any other type */>::knownTypeVar=2;//具化定義,給出T型別,同時定義num,T可以是其他任意特定型別。
- template <typename T> int TestTemStatic<T>::knownTypeVar=50;//範化定義,定義num時不需要知道T的型別
如果你想給特定型別T的靜態成員一個特定的值,使用第一種方式。如果你希望對任意型別T的都有一份通用的值,請使用第二種方式。
兩種初始化可以並存,對於特定型別T如果存在具化定義,則以具化定義為準。並且對於特定型別T的具化定義不可在不同的(CPP)實現檔案中重複。
- //a.cpp
- template <typename T> int TestTemStatic<T>::knownTypeVar=50
; - //b.cpp
- template <typename T> int TestTemStatic<T>::knownTypeVar=60;
範化定義可以在不同的(cpp)實現檔案重複也可以賦予不同數值, 連結器負責選出唯一定義。選擇哪一個與具體的編譯順序有關。
因此,範化定義可以放在標頭檔案中,具化定義放在唯一的cpp檔案中。
對於第二中只有一種初始化方式:
template <> float TestTemStatic<float>::unKnownTypeVar=4.0f;
由於unKnowTypeVar的定義依賴模版引數T的型別,所以定義unKnownTypeVar時必須給出T的型別。同樣,對於特定型別T的具化定義不可在不同的(CPP)實現檔案中重複。