我不確定你的意思是「初始化cpp內部的類型會產生鏈接器錯誤。」但假設你實際上的意思是定義爲那麼你必須做錯了什麼,因爲在適當的位置爲每種類型定義靜態成員當然可行!你所擁有的類模板是一個對象的聲明,如果它曾經被引用過,這需要在某個地方定義。只有MyType
碰巧是一個整數類型,你可以在你的類[template]中初始化它,並且你永遠不需要它的地址(例如綁定到一個常量引用或者它的地址),而不用定義它。這是因爲在這種情況下它始終被視爲一個常量表達式。
我的猜測是,你試圖定義一些CPP文件的對象是這樣的:
template <typename T> MyType const MyClass<T>::Type = some-initialization-here;
這是行不通的,除非你也是在同一翻譯單元或隱或顯實例化這個定義。您可以定義成員的特定類型是這樣的:
template <> MyType const MyClass<T>::Type = some-initialization-here;
除非你真正需要的類型是常量表達式在這種情況下,你通常可以側步的問題,如果有必要通過成爲一個enum
(這是我傾向於這樣做,因爲這傢伙可以綁定到const
參考無需定義),您可以使用它可以在頭部,而不是被定義靜態成員函數:
template <typename T>
MyType const& MyClass<T>::Type() {
static MyType rc = some-initialization-here;
return rc;
}
BTW,我嗯非常確定這個問題之前回答,絕對在comp.lang.c++.moderated。
「在標題內部初始化類型將導致它被多次初始化。」你能否舉一個例子來說明你如何去做?如果您只是檢查構造函數是否被多次調用,則應該多次調用該構造函數,因爲每個模板類實例化都有一個成員。 – hvd 2012-01-08 20:02:34