为什么下面的代码会编译?我没有专门化模板类的模板成员函数,因此只应使用一个template<>
。但是,g ++编译时没有任何警告,clang ++只给出警告
警告:模板中无关的模板参数列表 专业化
template<typename T>
struct S{};
template<> template<> // why can we do this?
struct S<int>{};
int main()
{
}
答案 0 :(得分:4)
因为语法允许,并且似乎没有任何模板专业化部分禁止它:
来自[gram.temp]
明确分工:
template < >
声明
来自[gram.dcl]
声明:
[...]
明确分工
自2001年以来,active issues list(#293)一直存在语法过于宽松的事实。
答案 1 :(得分:2)
来自更旧版本的clang的错误报告(以PR5559提交)也讨论了该问题。问题是当涉及到多个模板声明在显式特化期间是否有效时,gcc和clang都存在差异。 Quoth Gabor Greif:
第一个错误实际上是没有,clang正确地诊断出只有一个&#34;
template <>
&#34;需要。但是因为g ++接受了这个并且有几个人(像我一样)可能会误以为#34;template <>
&#34; s的数量是由嵌套而不是专门的级别数来控制的,它可能是有趣的是将错误减少为警告并可能发出修正提示。
差异也可能是由标准的明确规范的循环定义引起的(如@user657267所述)。