2009-09-12 1342 views
20

下面的模板特碼:C++函數模板特殊化: 「非法使用顯式模板參數」

template<typename T1, typename T2> 
void spec1() 
{ 

} 

測試案例1:

template< typename T1> //compile error 
void spec1<int>() 
{ 

} 

測試案例2:

template< typename T2> //compile error 
void spec1<int>() 
{ 

} 

生成以下編譯錯誤:

error C2768: 'spec1' : illegal use of explicit template arguments

有誰知道爲什麼?

+0

你在使用什麼平臺/編譯器? – aaa90210 2009-09-12 22:57:03

+0

我正在使用Visual C++ 08 – jameszhao00 2009-09-13 01:23:45

回答

51

函數模板不能部分專用,只有充分,即這樣的:

template<> 
void spec1<char, int>() 
{ 

} 

爲什麼函數模板不能部分專業,你可能要read this

當你專注部分(僅適用於類),你必須那樣做:

template <typename T1> 
class class1<T1, int> 
{ 

}; 

所以必須再次列出T1

你的專業化寫作方式,他們會模糊spec1<int, int>

+3

啊所以我可以有部分專用類嵌入靜態功能? – jameszhao00 2009-09-13 01:24:33

+0

哦,我看到你鏈接的文章已經解釋了問題。我刪除了我的答案,因爲我發現在這種情況下轉發到一個班級更方便。在使用'T1'和'T2'作爲函數參數類型的情況下,我發現重載更可讀,因爲它就像正常函數重載那樣。 – 2009-09-13 02:18:33

+0

當我讀到「只能上課時」時,我b。不安。我發現對於類和結構都是可能的;-)。 – 2014-04-17 15:26:38