通过模板别名显式实例化类

时间:2014-08-04 11:59:03

标签: templates c++11 template-aliases explicit-instantiation

是否可以通过模板别名显式实例化模板类?

如果是这样,怎么样?否则,有人可以指向讨论并决定反对的ISO论文吗?

template<class T>
struct A { };

/// Explicit instantiate A for int:
template struct A<int>;

/// Alias
template<class T>
using B = A<T>;

/// Explicitly instantiate A for double via alias B:
template struct B<double>;
/// error: elaborated type refers to a non-tag type

不应该实例化A<double>,因为B<T>只是A<T>的另一个名称?

1 个答案:

答案 0 :(得分:11)

这是间接禁止的,因为:

7/3禁止在没有 class-key classstructunion)的情况下编写显式特化:

  

简单声明中,只有在声明类(第9节)或枚举(7.2)时,才能省略可选的 init-declarator-list ,即,当 decl-specifier-seq 包含类说明符时,详细说明类型说明符包含类键(9.1),或枚举说明符

7.1.6.3/2禁止将 class-key 与别名模板专门化相结合:

  

3.4.4描述了如何在 elaborated-type-specifier 中对标识符进行名称查找。 ...如果标识符解析为 typedef-name simple-template-id 解析为别名模板特化,则 elaborated-type-specifier 格式不正确。

相关问题