1. 程式人生 > >C++模板類中靜態資料成員初始化

C++模板類中靜態資料成員初始化

首先看程式碼,靜態資料成員分為兩種情況,第一種不依賴模版型別引數,第二種依賴模版型別引數。

  1. template <typename T> class TestTemStatic
  2. {
  3. public:
  4. static int knownTypeVar;
  5. static T unKnownTypeVar;
  6. };
那麼如何初始化呢?

對於第一種存在兩種初始化方式:

  1. template <> int TestTemStatic<int/* any other type */>::knownTypeVar=2;//具化定義,給出T型別,同時定義num,T可以是其他任意特定型別。
  2. template <typename T> int TestTemStatic<T>::knownTypeVar=50;//範化定義,定義num時不需要知道T的型別
如果你想給特定型別T的靜態成員一個特定的值,使用第一種方式。如果你希望對任意型別T的都有一份通用的值,請使用第二種方式。

兩種初始化可以並存,對於特定型別T如果存在具化定義,則以具化定義為準。並且對於特定型別T的具化定義不可在不同的(CPP)實現檔案中重複。

  1. //a.cpp
  2. template <typename T> int TestTemStatic<T>::knownTypeVar=50
    ;
  3. //b.cpp
  4. template <typename T> int TestTemStatic<T>::knownTypeVar=60;
範化定義可以在不同的(cpp)實現檔案重複也可以賦予不同數值, 連結器負責選出唯一定義。選擇哪一個與具體的編譯順序有關。

因此,範化定義可以放在標頭檔案中,具化定義放在唯一的cpp檔案中。

對於第二中只有一種初始化方式:

template <> float TestTemStatic<float>::unKnownTypeVar=4.0f;
由於unKnowTypeVar的定義依賴模版引數T的型別,所以定義unKnownTypeVar時必須給出T的型別。同樣,對於特定型別T的具化定義不可在不同的(CPP)實現檔案中重複。