C 14警告:太多的变量模板标头(应该为0)

C++14 warning: too many template headers for variable (should be 0)

本文关键字:警告 太多 变量      更新时间:2023-10-16

在尝试最近的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?
}

此语法有什么谜?

模板参数只能在函数模板的显式专业中省略。您有一个可变模板,因此必须包括<int>

template<> int a<int> = 1;

引用C 14(N4140),14.7.3/10(强调矿山):

tailting template-argument 可以在 template-id 中未指定的命名显式功能模板 专业可以从函数参数类型中推导。

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

template<> auto a<int> = 1;

[实时示例]使用clang。

需要牢记一件事:当使用auto时,将从启动器而不是从模板参数中推导出专用变量的类型。而且,由于专业化的类型可能与主模板不同,因此即使它们不同,编译器也会很乐意接受。