C ++模板专门化语法

在C ++ Primer Plus(2001,Czech Translation)中,我发现了这些不同的模板特化语法:

函数模板

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 

使用Googlesearch一下,我发现只有3号的例子。 其中有没有什么区别(通话,编译,使用)? 他们中的一些已经过时/弃用了吗? 为什么不使用1号?

这里有每个语法的注释:

 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 

从编码的angular度来看,过载优于function模板专业化。

所以,不要专门的function模板:

  • 为什么不专门function模板?
  • 模板专业化和重载

并了解术语:

  • 实例
  • 显式实例化
  • 专业化
  • 明确的专业化

看到这个:

  • 实例化与c ++模板专业化的区别

使用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