Почему компилятор Visual Studio C++ отклоняет перечисление в качестве параметра шаблона?
Я использую компилятор Microsoft Visual Studio 2019 (cl.exe), и он отклоняет некоторый код, принятый и Clang, и GCC, связанный с использованием перечислений в качестве параметров шаблона, где шаблоны специализированы для определенных значений перечисления.
enum Foo {
Bar,
Baz
};
template<enum Foo = Bar> class Clazz {
};
template<> class Clazz<Baz> {
};
Компилятор VC++ сообщает о нескольких ошибках специализации шаблона:
<source>(10): error C2440: 'specialization': cannot convert from 'Foo' to 'Foo'
<source>(10): note: Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
Этот код принят без ошибок как Clang, так и GCC. Это ошибка с VC++?
Замена 'enum Foo' в объявлении шаблона просто 'int' приводит к исчезновению ошибок. Однако это не приемлемый ответ, так как я пытаюсь перенести большую кодовую базу на VC++.
Ответы
Ответ 1
Ваш код будет компилироваться, если вы используете опцию компилятора в режиме соответствия стандартам /permissive-
для указания поведения компилятора, соответствующего стандартам.
Вы можете добавить эту опцию в командной строке или в "странице свойств проекта → C/C++ → Язык → Режим соответствия".
Ответ 2
Вам не хватает буквы T:
template<enum Foo T = Bar> class Clazz {
Или иметь дополнительное перечисление:
template<Foo = Bar> class Clazz {
Этот второй намного приятнее, спасибо Франсуа.