【发布时间】:2014-04-22 14:01:14
【问题描述】:
使用 C++11 的强类型 enums,可以像这样声明一个类的成员枚举:
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 都分别抱怨“错误:'enum X::E' 是一个枚举模板 [-pedantic]”和“错误:枚举不能是一个模板”。我认为相关的标准部分(事实上,这个问题源于此)是§14 Templates,其中第一段指出:
模板声明中的声明应
- 声明或定义函数或类,或
- 定义成员函数、成员类、成员枚举或类模板的静态数据成员或嵌套在类模板,或
- 定义类或类模板的成员模板,或
- 是一个别名声明。
(强调我的)。那么这是一个编译器错误,还是我完全误解了该语句?
【问题讨论】:
-
gcc 4.8.1 仍然考虑it is an error,而clang 3.4 does not。
-
使用 gcc 4.8.2 编译。
-
@evnu 即使有
-pedantic-errors编译器标志? -
@Constructor 我的错,我忘记了参数。不,它也会发出警告。
-
@Constructor:是的,这看起来很有希望。想要发布它作为答案?
标签: c++ templates c++11 enums forward-declaration