enum class E : CL<E>::UndType;
いくつかの現在の実装(テストされたclang ++、g ++、MSVC)では有効な宣言として受け入れられません。彼らは、まだ完成していないタイプのE
を受け入れていません。enum-baseCL<E>::UndType
です。テストされた実装で与えられたエラーは、E
がであり、その時点でであることが宣言されています。彼らはenum-baseの終わりに宣言のポイントを置くようですが、完了したら宣言したものとみなします。
仕様を読むとき。
§14.3.1/ 2テンプレート型引数
[注:テンプレート型引数は、不完全型(3.9)であってもよいです。 - エンドノート]
そして
§7.2/ 6列挙宣言
基底型固定されている宣言のその点から不完全型で列挙(3.3.2) enum-base(存在する場合)の直後まで、完全な型になります。
コンパイル可能ですか? CRTP実装の場合と同様です。
これは(すなわち、enum class E : CL<E>::UndType;
をコンパイルできなかった)が意図か、それがユースケースとみなされたかどうかは確かです。この仕様から、不透明なenum宣言にはいくつかの "特別な"扱いが与えられています。その基底型とそれが整数型でなければならないという要件。
おそらくコードは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 *の ';'( '// error'の前に)あると思います。 – Jarod42
'CL'では 'E'は実際にはまだ宣言されていません:( –
Jarod42
Jarod42、なぜそれはまだ宣言されていませんか?標準では識別子の直後であると言っていますか?それは – user3514538