在C++中有多个基本模板的情况下的模板专用化
Template specialization in case of multiple base templates in C++
我有两个模板函数:
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)。
这个参数推导考虑了主模板的偏序,即它找到了第二个主模板。我没有陷入阅读打油诗前一段的陷阱,但警告是真实的:我认为如果你改变第二个主要模板的顺序和专业化,你会遇到麻烦!小心上面提到的自焚警告。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- 是否可以在没有显式专用化的情况下调用可变参数模板函数?
- 在不使用专用计数器的情况下检查QTextStream读取的总行数
- 如何在不创建空类的情况下避免"big"模板类的专用化?
- 在不使用专用语法的情况下,为不同类型的不同方式实现模板类的方法是否有效C++?
- 在C++中有多个基本模板的情况下的模板专用化