У меня есть код на C++, который имеет следующую форму:
template <typename type>
class foo
{
type a;
class bar;
};
template <typename type>
class foo<type>::bar
{
enum class baz;
};
template <typename type>
enum class foo<type>::bar::baz
{
val1,
val2
};
С помощью этого кода я пытаюсь сделать класс перечисления доступным для методов внутри foo :: bar и иметь возможность хранить данные типа этого класса перечисления. Класс enum также не должен быть типом шаблона - перечислители класса enum являются целыми числами / типом по умолчанию для класса enum.
Однако, когда я компилирую это MinGW / Code :: Blocks, кажется, появляется два сообщения об ошибке, оба в строке:
enum class foo<type>::bar::baz
error: template declaration of 'enum baz'
error: foo<type>::bar has not been declared
Я думаю, что это почти наверняка ошибка компилятора. Основываясь на temp.mem.class и temp.mem.enum, я бы сказал, что это определенно должен быть действительный C++. clang, а также icc, похоже, отлично компилируют этот код. Однако GCC (MinGW - это в основном GCC), а также MSVC, по-видимому, не могут скомпилировать это. Кажется, что оба компилятора (даже в своих самых последних версиях) ошибочно принимают это определение члена перечисления шаблона класса за попытку объявить шаблон перечисления (что действительно было бы незаконным) ...
Обновлено: в случае MSVC, похоже, уже есть открытая проблема здесь