2010-10-14 40 views
4

我試圖定義一個構造函數的類定義之外的明確專門的類模板,像這樣的:淘汰類的構造函數定義了一個專門的類模板

template <typename T> 
struct x; 

template <> 
struct x<int> { 
    inline x(); 

    /* This would have compiled: 
    x() { 
    } 
    */ 
}; 

template <> // Error 
x<int>::x() { 
} 

但它似乎是一個錯誤。科莫說:error: "x<int>::x()" is not an entity that can be explicitly specialized,即使完整的課程是專業。

這裏有什麼問題?

+0

我從來沒有見過這個。這裏知道答案會很有趣。一般來說,我保持我的模板內聯編碼,以減少所有不必要的混亂。 – 2010-10-14 17:42:25

+0

使用g ++,我得到錯誤'template-id'x <>'for'x :: x()'與任何模板聲明不匹配。然而,如果我改變它,所以它不是一個構造函數,我仍然得到一個等效的錯誤:'void x :: pants()'的'template-id'褲子'>'不匹配任何模板聲明。 – 2010-10-14 17:54:20

+0

@Josh D:當然可以。實際上,它是唯一的選擇,例如,沒有有意義的泛型定義的char_traits <>類型的類 - 未定義專門化的類參數將生成編譯錯誤。 – 2010-10-14 17:55:35

回答

13

不要爲定義指定template<>

template <typename T> 
struct x; 

template <> 
struct x<int> { 
    x(); 
}; 

inline x<int>::x(){} 

編輯:構造函數的定義是不是一個特例,所以template<>是不必要的。這是專業化構造函數的定義。所以,你只需要像其他非模板類一樣指定類型。

+0

沒想到放棄模板聲明。謝謝。 – 2017-05-11 23:41:08