模板参数可以既是 int 又可以是无符号长整型吗?

Can a template parameter be both an int and an unsigned long?

本文关键字:无符号 长整型 int 参数      更新时间:2023-10-16

我有以下代码:

#include <iostream>
template<size_t N>
class A
{
};
template<int N, typename T> class B;
template<int N>
class B<N, A<N>>
{
};
int main()
{
B<3, A<3>> b;
return 0;
}

在这里,Bint上模板化,而Asize_t上模板化,这是我使用的两个编译器的unsigned long

当我使用编译器 1(当前编译器)时,一切都按照我期望的方式编译和工作。使用编译器 2(我们正在转向的编译器)时,我收到一个编译器错误,指出B没有模板专用化,需要unsigned long- 它将3解释为unsigned long,因为它需要是一个用于A,但随后找不到任何B。修复是显而易见的,-只需更改B以采用size_t(或更改A以采用int) - 但我想知道哪个是严格正确的标准。我的直觉是它是编译器 2(抛出错误的那个)。

从 [temp.deduct.type]:

如果P具有包含<i>的表单,并且i的类型与由封闭的简单模板 id命名的模板的相应模板参数的类型不同,则推导失败。

NA<N>是一个int应该无法扣除,因为A对应的模板参数实际上是size_t。这是一个编译器 #1 错误。