我有以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
在这里,B模板化的int时间A是模板化的size_t,这是unsigned long我正在使用的两个编译器.
当我使用编译器1(当前编译器)时,一切都按照我期望的方式编译和工作.当使用编译器2(一个我们正在向),我得到一个编译器错误,指出没有模板专业化B接受一个unsigned long-它解释3为unsigned long因为它需要一个A,但后来找不到任何事情B.修复是显而易见的, - 只需更改B以采取一个size_t(或更改A为采取int) - 但我想知道哪个是标准严格正确.我的直觉是它是编译器2(抛出错误的那个).
来自 [temp.deduct.type]:
如果
P有一个包含 的表单<i>,并且 的类型与由封闭的simple-template-idi命名的模板的相应模板参数的类型不同,则推导失败。
A<N>forN是一个int应该失败的推导,因为 对应的模板参数A实际上是size_t。这是编译器#1 的错误。