【发布时间】:2015-07-15 02:42:50
【问题描述】:
在尝试最近的 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?
}
这个语法有什么奥秘?
【问题讨论】:
-
这是一个非常具有误导性的警告。我很惊讶这不是一个错误。这是唯一的诊断吗?
-
@Yakk,在 g++-5 中是的,这是唯一的诊断。不过,不确定 clang。
-
啊,我想我现在收到警告了!这是说
int a = 1;应该有0 个模板头,其中template<不管>是一个模板头。想象一下,如果你在它之前删除了template<class T> T a;——警告是有道理的。仍然令人震惊的是,这是一个警告,而不是错误。 -
复制自here如果你特化了[一个变量模板],那么又会导致多重定义错误。例如
template<typename T> T a = 1; template<> int a = 0;,如果你把这个语句放在一个公共头文件中,那么 ... 语句将导致链接器错误.
标签: c++ language-lawyer c++14 template-specialization variable-templates