2011-11-30 97 views
38

在C++中的Primer Plus(2001年,捷克語翻譯)我發現這些不同的模板特語法:C++模板專業化語法

函數模板

template <typename T> void foo(T); 

專業化語法

void foo(int param); // 1 
void foo<int>(int param); // 2 
template <> void foo<int>(int param); // 3 
template <> void foo(int param); // 4 
template void foo(int param); // 5 

使用Google搜索了一下,我發現只有No.3的例子。其中有沒有區別(通話,編譯,使用)?其中一些已經過時/棄用了嗎?爲什麼不使用1號?

+3

這是一般使用(並認爲)術語「函數模板」,因爲這強調,這是一個好主意一個模板,而不是一個函數,無論需要什麼功能,你都不能使用模板(只有專業化,因爲那時候是功能)。 – PlasmaHH

+0

它可能是一個錯誤的翻譯,或者你錯了。我建議你閱讀更多關於模板和函數重載的區別。 – varepsilon

回答

61

以下是與每個語法評論:

void foo(int param); //not a specialization, it is an overload 

void foo<int>(int param); //ill-formed 

//this form always works 
template <> void foo<int>(int param); //explicit specialization 

//same as above, but works only if template argument deduction is possible! 
template <> void foo(int param); //explicit specialization 

//same as above, but works only if template argument deduction is possible! 
template void foo(int param); //explicit instantiation 

由我補充:

//Notice <int>. This form always works! 
template void foo<int>(int param); //explicit instantiation 

//Notice <>. works only if template argument deduction is possible! 
template void foo<>(int param); //explicit instantiation 

從編碼的角度來看,過載優於函數模板專業化。

所以,不要專門的函數模板:

而且知道的術語:

  • 實例
  • 顯式實例
  • 專業化
  • 明確的專業化

看到這個:

+4

+1,注意重載應該是首選。 – avakar

+0

@avakar:鏈接到相關的[GotW'Why Not Specialize Function Templates?](http://www.gotw.ca/publications/mill17。htm)Herb Sutter的文章 – sehe

+1

@sehe:在我的回答中添加了鏈接。 – Nawaz

2

使用Visual Studio 2012,它似乎工作稍有不同,如果沒有函數參數:

template <typename T> T bar(); 
//template int bar<int>() { return 0; } doesn't work 
template < > int bar<int>() { return 0; } //does work