can模板别名可用于部分专业化吗?

时间:2012-08-28 10:53:53

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

给定模板别名

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生成template parameter can not be deduced警告,而gcc 4.7没有生成警告

那么,代码是否格式错误?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

另一个人说这是一个Clang bug。如果你改变像这样的使用声明

,你可以解决它
template<unsigned T, unsigned U = T>
using uint_ = integral_constant<unsigned,U>;

作为一个有根据的猜测,显然Clang没有正确更新type-id中出现的模板参数的身份。因此,在您的示例中,它认为结果类型uint_<U>引用了部分特化的第一个参数(因为在uint_内是这种情况,但不是在使用点)。或者,您可以在使用地点交换订单

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