次のテスト コードを clang でコンパイルしていました。
template<typename T> struct S1
{
struct S2{
enum class E1;
enum class E2: T;
enum class E3: short;
};
typename S2::E1 b1;
typename S2::E2 b2;
typename S2::E3 b3;
enum class S1::S2::E1 {e11,e12};
enum class S1::S2::E2 : T {e21,e22};
enum class S1::S2::E3 : short {e31,e32};
};
template struct S1<int>;
エラーが発生しました: テンプレートの特殊化または定義には、ネストされた型 'S1< T >' に対応するテンプレート パラメーター リストが必要です。私の推測では、構造体 S1 がメンバーの追加中に定義されているためです
enum class S1::S2::E1 {e11,e12}
enum class S1::S2::E2 : T {e21,e22};
enum class S1::S2::E3 : short {e31,e32};
S1 がまだインスタンス化されておらず、したがって T を解決できないため、コンパイラは T が何であるかを知りません。したがって、コンパイラは列挙型メンバーのサイズを認識しないため、エラーがスローされます。これは正しいです?規格に規定されているか?
注 : gcc はそのようなエラーをスローしません。