别名模板的部分专业化

时间:2014-02-14 08:40:24

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

不允许使用别名模板的部分特化:

例如,尝试发挥创意,会在clang中产生此错误:

template <typename T>
using unwrapped_future_t = T;

template <typename T>
using unwrapped_future_t<future<T>> = typename future<T>::value_type;
                        ^~~~~~~~~~~
> error: partial specialization of alias templates is not permitted

为什么不允许这样做?

1 个答案:

答案 0 :(得分:10)

您可以在original proposal别名模板中找到答案:

  

2.2主要选择:专业化与其他一切

     

经过对反射器和Evolution WG的讨论后,我们发现我们必须在两种相互排斥的模型之间进行选择:

     
      
  1. typedef模板本身不是别名;只有typedef模板的(可能是专用的)实例化才是别名。这个选择允许我们对typedef模板进行专门化。

  2.   
  3. typedef模板本身就是一个别名;它不能专业化。这个选择将允许:

         
        
    • 对typedef模板函数参数的推论(见2.4)
    •   
    • 使用typedef模板表示的声明与不声明声明相同   typedef templates(见2.5)
    •   
    • typedef模板以匹配模板模板参数(参见2.6)
    •   
  4.