是否可以通过模板别名显式实例化模板类?
如果是这样,怎么样?否则,有人可以指向讨论并决定反对的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>
的另一个名称?
答案 0 :(得分:11)
这是间接禁止的,因为:
7/3禁止在没有 class-key (class
,struct
或union
)的情况下编写显式特化:
在简单声明中,只有在声明类(第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 格式不正确。