14

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

如果是这样,怎么做?否则,有人可以指出讨论并决定反对的 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>吗?

4

1 回答 1

12

这是间接禁止的,因为:

7/3 禁止在没有类键class、、structunion)的情况下编写显式特化:

simple-declaration中,可选的init-declarator-list只有在声明一个类(第 9 条)或枚举(7.2)时才可以省略,也就是说,当decl-specifier-seq包含一个类说明符、一个详细说明时-type-specifier带有类键(9.1) 或enum-specifier

7.1.6.3/2 禁止将类键与别名模板特化组合:

3.4.4 描述了如何在详细类型说明符中对标识符进行名称查找。...如果标识符解析为typedef-namesimple-template-id解析为别名模板特化,则详细说明的类型说明符格式错误。

于 2014-08-04T12:36:20.897 回答