以下;
enum class E : CL<E>::UndType;
在某些当前实现(测试的clang ++,g ++和MSVC)中不被接受为有效声明。他们不接受在enum-baseCL<E>::UndType
中尚未完成的E
。在测试的实现中给出的错误是E
是未声明的在那一点。他们似乎在enum-base的末尾声明了声明的位置,他们认为声明完成后就会声明它。
在阅读规格时;
§14.3.1/ 2的模板类型参数
[注:模板类型参数可以是一个不完整的类型(3.9)。 - 注完]
而且
§7.2/ 6枚举声明
枚举其基础类型是固定的是从其点声明的一个不完整的类型(3.3.2)在它的enum-base(如果有)之后立即变为完整类型。
暗示它是可编译的;就像CRTP实施的情况一样。
我很确定这个(即编译失败enum class E : CL<E>::UndType;
)是用意还是它被认为是一个用例。从规范中,不透明枚举声明被给予一些“特殊”处理w.r.t.它的基本类型以及它必须是一个整体类型的要求。
假定分辨率为CWG#1482,代码应该可编译。
至于目前的解决方法...
这个;
enum class E; // default underlying type is int
是最小声明。
不透明的声明可以是;
enum class E : int; // int base
以下将是一个完整定义(包括枚举数);
enum class E : int {/*...*/};
或者要使用类模板,可以使用另一种类型(可能为void
)。
enum class E : CL<void>::UndType;
我会说它是在* opaque-enum-declaration *的'('//错误之前)'。 – Jarod42
因此,在'CL'中,'E'确实还没有被声明:( –
Jarod42
Jarod42,但是为什么它还没有被声明呢?标准说它紧跟在标识符后面,不是吗?我不明白它 – user3514538