【问题标题】:can template alias be used for partial specialization?模板别名可以用于部分专业化吗?
【发布时间】:2012-08-28 10:53:52
【问题描述】:

给定一个模板别名

template<unsigned U>
using uint_ = integral_constant<unsigned,U>;

部分特化

template<class T,class P>
struct size{};

作为

template <class T,unsigned U>
struct size<T,uint_<U>>{};

为 clang 3.1 生成警告 astemplate parameter can not be deduced 而 gcc 4.7 不生成警告

那么,是不是格式错误的代码?

【问题讨论】:

  • 我看不出这不可行的原因。别名模板会立即被替换。
  • 它不仅在 clang 3.1 中给出警告,而且如果我尝试实例化它,它会忽略专业化。但是,直接使用integral_constant 代替别名可以照常工作。我猜是clang bug。
  • @abir:这意味着模板别名在 Clang 中没有正确实现。

标签: c++ c++11 partial-specialization


【解决方案1】:

代码在 C++11 中非常好。可以忽略 Clang 的警告。

【讨论】:

    【解决方案2】:

    另一个人说这是一个 Clang 错误。如果您像这样更改 using 声明,您可以解决它

    template<unsigned T, unsigned U = T>
    using uint_ = integral_constant<unsigned,U>;
    

    作为有根据的猜测,显然 Clang 没有正确更新出现在 type-id 中的模板参数的标识。因此,它认为在您的示例中,结果类型 uint_&lt;U&gt; 指的是部分专业化的第一个参数(因为在 uint_ 中就是这种情况,但不是在使用点上)。或者,您可以在使用点交换订单

    template <unsigned U,class T>
    struct size<T,uint_<U>>{};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2013-12-04
      相关资源
      最近更新 更多