使用C ++ 11的强类型enum
,可以声明类的成员枚举,如下所示:
class X {
public:
enum class E;
};
enum class X::E { a, b };
但是,在制作X
课程模板时:
template <typename T>
class X {
public:
enum class E;
};
template <typename T>
enum class X<T>::E { a, b };
gcc 4.7.2和clang 3.0都抱怨“错误:'枚举X :: E'是枚举模板[-pedantic]”和“错误:枚举不能是模板”。我认为相关的标准部分(事实上,这个问题来自于)是§14模板,其中第一段说明:
模板声明中的声明应
- 声明或定义函数或类,或
- 定义成员函数,成员类,成员枚举,或类模板的静态数据成员 或类嵌套在类模板中,或
- 定义类或类模板的成员模板,或
- 是 alias-declaration 。
(强调我的)。这是一个编译器错误,还是我完全错误地解释了该语句?
答案 0 :(得分:3)
我被要求创建这个答案。参见C ++标准的段落[temp.mem.enum] 14.5.1.4/1:
类模板的枚举成员可以在...之外定义 类模板定义。 [示例:
template<class T> struct A { enum E : T; }; A<int> a; template<class T> enum A<T>::E : T { e1, e2 }; A<int>::E e = A<int>::e1;
- 示例]
较新版本的 clang (3.4)compiles your code successfully,标记为-pedantic-errors
,而 gcc 4.8.1 still considers it is an error。我认为这是一个 gcc 错误。