【问题标题】:Can a template parameter be both an int and an unsigned long?模板参数可以同时是 int 和 unsigned long 吗?
【发布时间】: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&lt;3, A&lt;3&gt;&gt; 到专业化:melpon.org/wandbox/permlink/foJKj2W66hK9bLAk
  • 最简单的解决方法不是class B&lt;N, A&lt;size_t(N)&gt;&gt; 吗?您可以对非类型模板参数使用常量表达式。

标签: c++ templates


【解决方案1】:

来自[temp.deduct.type]:

如果P 有一个包含&lt;i&gt; 的表单,并且如果i 的类型与由封闭的simple-template-id 命名的模板的相应模板参数的类型不同em>,扣费失败。

A&lt;N&gt; for N 是一个int 应该会失败,因为A 对应的模板参数实际上是size_t。这是编译器 #1 错误。

【讨论】:

  • @MarcoA。这是gcc
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2017-09-25
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多