以下引用来自14.5.1/4 [temp.class]
:
在重新声明,部分专业化,明确专业化或 显式实例化类模板, class-key 应该同意 与原始类模板声明
的实物
我认为这意味着我们无法使用另一个类键声明显式特化,例如:
template <class T, class W>
struct A
{
void foo();
};
template <class T, class W>
class A<T*, W> // Should have printed an error
{
void foo();
};
但它运作正常。那么该规则的重点是什么?
答案 0 :(得分:2)
在引用的句子之后是对[dcl.type.elab]的引用。 [dcl.type.elab] / p3描述了“实物同意”的含义:
class-key 或
enum
关键字 elaborated-type-specifier 应与 elaborated-type-specifier 中的名称所引用的声明一致。 [...] 因此,在任何 elaborated-type-specifier 中,enum
关键字应为 用于引用枚举(7.2),union
class-key 应该 用于指代一个联合(第9条),以及class
或struct
class-key 将用于指代一个类(第9条) 使用class
或struct
类密钥声明。
换句话说,如果主模板是联合,则“重新声明,部分特化,显式特化或显式实例化”必须使用union
;否则它可以使用class
或struct
,但不能使用union
。