在C++中有多个基本模板的情况下的模板专用化

Template specialization in case of multiple base templates in C++

本文关键字:情况下 专用 C++      更新时间:2023-10-16

我有两个模板函数:

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之前或之后定义专业化,这有关系吗?

X替换为int,并查看哪个主模板生成匹配的签名:

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.decture.dell]第1段:,使用正常参数推导规则找到相关的主模板

在声明符id引用函数模板的专门化的声明中,执行模板参数推导来标识声明引用的专门化。具体来说这是针对显式实例化(14.7.2)而完成的,明确的专业化(14.7.3)和某些朋友声明(14.5.4)。

这个参数推导考虑了主模板的偏序,即它找到了第二个主模板。我没有陷入阅读打油诗前一段的陷阱,但警告是真实的:我认为如果你改变第二个主要模板的顺序和专业化,你会遇到麻烦!小心上面提到的自焚警告。