C++14 警告:变量的模板 headers 太多(应为 0)
C++14 warning: too many template headers for variable (should be 0)
在试验最近的 g++-5 编译器时,我在文件中写了以下语句:
template<T> T a;
template<> int a = 1;
这导致:
warning: too many template headers for a
(should be 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(强调我的):
A trailing template-argument can be left unspecified in the template-id naming an explicit function template
specialization provided it can be deduced from the function argument type.
如果不想重复类型,可以使用auto
:
template<> auto a<int> = 1;
[Live example] 使用 Clang。
有一点需要牢记:当使用 auto
时,专用变量的类型将从初始化程序中推导出来,而不是从模板参数中推导出来。由于特化可以具有与主模板不同的类型,即使它们不同,编译器也会很乐意接受它。
在试验最近的 g++-5 编译器时,我在文件中写了以下语句:
template<T> T a;
template<> int a = 1;
这导致:
warning: too many template headers for
a
(should be 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(强调我的):
A trailing template-argument can be left unspecified in the template-id naming an explicit function template specialization provided it can be deduced from the function argument type.
如果不想重复类型,可以使用auto
:
template<> auto a<int> = 1;
[Live example] 使用 Clang。
有一点需要牢记:当使用 auto
时,专用变量的类型将从初始化程序中推导出来,而不是从模板参数中推导出来。由于特化可以具有与主模板不同的类型,即使它们不同,编译器也会很乐意接受它。