我有两个模板功能:
template<class X> void foo(X a)
{
cout << "Template 1" << endl;
}
template<class X> void foo(X *a)
{
cout << "Template 2" << endl;
}
现在,如果我定义一个专门化,例如:
template<> void foo<>(int *a)
{
cout << "Specialization 1" << endl;
}
此专业化是否属于模板1或模板2.此外,如果我在模板2之前或之后定义专业化,这是否重要?
最佳答案 用int替换X并查看哪个主模板产生匹配的签名:
template<class X> void foo(X a)
变
template <> void foo<int>(int)
和
template<class X> void foo(X *a)
变
template<> void foo<int>(int *)
所以,它只能是第二个功能的专业化.由于该函数不专门化第一个重载,因此在定义特化之前必须声明第二个主模板,因为特化不能专门化第一个主模板.
如果未在专门化中明确指定模板参数,则根据14.8.2.6 [temp.deduct.decl]第1段使用正常参数推导规则找到相关的主模板:
In a declaration whose declarator-id refers to a specialization of a function template, template argument deduction is performed to identify the specialization to which the declaration refers. Specifically, this is done for explicit instantiations (14.7.2),
explicit specializations (14.7.3), and certain friend declarations (14.5.4).
该参数推导将主模板的部分排序考虑在内,即,它找到第二主模板.我没有陷入阅读导致打油门的段落的陷阱,但警告是真的:如果你改变第二个主要模板的顺序和专业化,我认为你会遇到麻烦!要注意上面提到的自焚警告.