C ++: Как определить класс enum вне тела класса шаблона, в котором он объявлен? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть некоторый код 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
};

С помощью этого кода я пытаюсь сделать класс enum доступным для методов внутри foo :: bar и иметь возможность хранить данные типа этого класса enum. Класс enum также не относится к типу шаблона - перечислители класса enum являются целыми числами / типом по умолчанию класса enum.

Однако, когда я компилирую это MinGW / Code :: Blocks, это, кажется, выдает два сообщения об ошибке, оба в строке:

enum class foo<type>::bar::baz

ошибка: объявление шаблона 'enum baz'

ошибка: foo :: бар не был объявлен

1 Ответ

0 голосов
/ 09 сентября 2018

Я думаю, что это почти наверняка ошибка компилятора. Основываясь на temp.mem.class и temp.mem.enum , я бы сказал, что это определенно должен быть допустимый C ++. clang и icc, похоже, компилируют этот код просто отлично. GCC (MinGW - это, в основном, GCC), а также MSVC, по-видимому, не компилируют это. Кажется, что оба компилятора (даже в их самых последних версиях) ошибочно принимают это определение элемента enum шаблона класса за попытку объявить шаблон enum (который действительно был бы недопустимым)…

быстрый тест здесь

Редактировать: В случае MSVC, кажется, уже есть открытый вопрос здесь

...