Tar*_*ral 8 c++ enums templates forward-declaration c++11
使用C++ 11的强类型enum
,可以声明类的成员枚举,如下所示:
class X {
public:
enum class E;
};
enum class X::E { a, b };
Run Code Online (Sandbox Code Playgroud)
但是,在制作X
类模板时:
template <typename T>
class X {
public:
enum class E;
};
template <typename T>
enum class X<T>::E { a, b };
Run Code Online (Sandbox Code Playgroud)
gcc 4.7.2和clang 3.0都抱怨"错误:'枚举X :: E'是枚举模板[-pedantic]"和"错误:枚举不能是模板".我认为相关的标准部分(事实上,这个问题来自于)是§14模板,其中第一段规定:
该声明在模板声明应
- 声明或定义函数或类,或
- 定义成员函数,成员类,成员枚举或类模板或嵌套在类模板中的类的静态数据成员,或者
- 定义类或类模板的成员模板,或
- 是一个别名声明.
(强调我的).这是一个编译器错误,还是我完全错误地解释了这个语句?
我被要求创建这个答案。请参阅 C++ 标准的 [temp.mem.enum] 14.5.1.4/1 段:
\n\n\n\n\n类模板的枚举成员可以在类模板定义之外定义。[例子:
\n\nRun Code Online (Sandbox Code Playgroud)\n\ntemplate<class T> struct A {\n enum E : T;\n};\nA<int> a;\ntemplate<class T> enum A<T>::E : T { e1, e2 };\nA<int>::E e = A<int>::e1;\n
\xe2\x80\x94end 示例]
\n
较新版本的clang (3.4)可以使用 flag成功编译您的代码-pedantic-errors
,而gcc 4.8.1仍然认为这是一个错误。我认为这是一个海湾合作委员会 bug。