模板<>用于成员枚举的显式特化

时间:2017-08-05 17:46:10

标签: c++ templates language-lawyer

根据17.7.3 [temp.expl.spec]第5段(N4659),

  

...显式专用类模板的成员以与普通类成员相同的方式定义,而不是使用template<>语法。定义显式专用成员类的成员时也是如此。 但是,template<>用于定义专门用作类模板的显式专用成员类模板的成员。

E的显式专业化绝对不属于大胆的情况,它仍然需要template<>。那是为什么?

template<class T> struct A {
    enum E : T;
};

template<> enum A<int>::E : int { eint };

1 个答案:

答案 0 :(得分:6)

此段落与显式专用类模板的成员相关,但您尚未明确专门化类模板。这是它所谈论的案例的一个例子:

template<class T> struct A {
    enum E : T;
};

template<> struct A<int> {
    enum E : int;
};

enum A<int>::E : int { eint }; // no template<> here

在您的示例代码中,您明确指定了主要模板的成员,该成员确实需要使用template<>,如第一段所述。

  

1以下任何一项的明确专业化:

     

...

     

(1.7) - 类模板的成员枚举

     

...

     

可以通过模板&lt;&gt;引入的声明声明;那是:   明确的分工:   模板&lt; &GT;声明

第5段背后的基本原则是,一旦你明确专门化了一个模板,它就不再是一个模板了,你就像使用任何其他非模板实体那样使用专门化。