以下;
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