重新声明的类名class-key

时间:2015-03-10 04:35:23

标签: c++ templates

以下引用来自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();
};

DEMO

但它运作正常。那么该规则的重点是什么?

1 个答案:

答案 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条)   使用classstruct 类密钥声明。

换句话说,如果主模板是联合,则“重新声明,部分特化,显式特化或显式实例化”必须使用union;否则它可以使用classstruct,但不能使用union