双模板<>在模板专业化

时间:2015-06-18 22:57:00

标签: c++ templates

为什么下面的代码会编译?我没有专门化模板类的模板成员函数,因此只应使用一个template<>。但是,g ++编译时没有任何警告,clang ++只给出警告

  

警告:模板中无关的模板参数列表         专业化

template<typename T>
struct S{};

template<> template<> // why can we do this? 
struct S<int>{};

int main()
{

}

2 个答案:

答案 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所述)。