【发布时间】:2017-03-02 15:07:50
【问题描述】:
我有以下代码:
#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;
}
这里,B 是在 int 上进行模板化的,而 A 是在 size_t 上进行模板化的,unsigned long 是我正在使用的两个编译器的unsigned long。
当我使用编译器 1(当前编译器)时,一切都按照我期望的方式编译和工作。使用编译器 2(我们正在使用的编译器)时,我收到一个编译器错误,指出 B 没有模板专门化,它采用 unsigned long - 它已将 3 解释为 unsigned long必须是A 的一个,但找不到B 的任何内容。解决方法很明显,只需将B 更改为size_t(或将A 更改为int)-但我想知道哪个是严格正确的标准。我的直觉是它是编译器 2(引发错误的那个)。
【问题讨论】:
-
您使用的究竟是哪些编译器?此信息可能对遇到您问题的其他人有用。
-
我没有包含它,因为它与问题并不严格相关,但“编译器 1”是 GNU 6.2,“编译器 2”是 Intel 17.0
-
FWIW,Clang 不匹配
B<3, A<3>>到专业化:melpon.org/wandbox/permlink/foJKj2W66hK9bLAk -
最简单的解决方法不是
class B<N, A<size_t(N)>>吗?您可以对非类型模板参数使用常量表达式。