19

在试验最近的 g++-5 编译器时,我在一个文件中写了以下语句:

template<T> T a;
template<> int a = 1;

结果是:

警告:太多的模板标题a(应该是 0)

同样有效的是,它并没有真正专业化a<int>。例如

template<typename T> T a;
template<> int a = 1;

int main ()  {
  std::cout << a<double> << "\n";  // prints 0; OK
  std::cout << a<int> << "\n";  // prints 0! why not 1?
}

这种语法有什么奥秘?

4

1 回答 1

23

模板参数只能在函数模板的显式特化中被省略。你有一个变量模板,所以你必须包括<int>

template<> int a<int> = 1;

引用 C++14 (n4140), 14.7.3/10 (强调我的):

如果可以从函数参数类型推导出来,则可以在命名显式函数模板特化的模板 ID中未指定尾随模板参数。

如果您不想重复该类型,可以使用auto

template<> auto a<int> = 1;

[现场示例]使用 Clang。

需要记住一件事:使用 时auto,专用变量的类型将从初始化程序中推导出来,而不是从模板参数中推导出来。而且由于特化可以具有与主模板不同的类型,因此即使它们不同,编译器也会很高兴地接受它。

于 2015-05-05T11:30:35.437 回答