Можем ли мы специализировать перечислимый (тип) член шаблона класса? - PullRequest
4 голосов
/ 25 мая 2019

Cppreference утверждает, что, помимо прочего, вы можете специализировать

  1. перечисление члена шаблона класса

Поскольку примеров не было предоставлено, я попытался угадать, как это сделать.

Я получил следующее:

template <typename T> struct A
{
    enum E : int;
};

template <> enum A<int>::E : int {a,b,c};

Clang (8.0.0 с -std=c++17 -pedantic-errors) компилирует его.

GCC (9.1 с -std=c++17 -pedantic-errors) отклоняет код с

error: template specialization of 'enum A<int>::E' not allowed by ISO C++ [-Wpedantic]

MSVC (v19.20 с /std:c++latest также отклоняет код с

error C3113: an 'enum' cannot be a template

Попробуйте на gcc.godbolt.org

Правильно ли я специализировал enum? Если нет, то теперь я делаю это?

1 Ответ

2 голосов
/ 25 мая 2019

Есть примеры в стандартном ([temp.expl.spec] / 6), которые указывают на то, что у вас правильно. Тот, который есть:

template<> enum A<int>::E : int { eint };           // OK

Похоже на ошибку gcc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...