В
s.set(DoorState::DoorOpened);
вы передаете тип, вы должны передать экземпляр типа, попробуйте
s.set(DoorState::DoorOpened{});
после этого изменения я смог скомпилировать в MSVC 2019 (16.1.3)
Редактировать: это редактирование адресов комментариев к Шеффу и Jarod24, если бы мы раскомментировали конструктор и написали
DoorState s(DoorState::DoorOpened());
* 1011, был бы самый неприятный анализ* Это могло быть исправлено с использованием единого синтаксиса инициализации, см., Например,
https://arne -mertz.de / 2015/07 / new-c-features -iform-initial-initialization-and-initializer_list / DoorState s{DoorState::DoorOpened{}};
Это решило бы самую неприятную проблему разбора, но создало бы новую проблему: DoorState::DoorOpened{}
было бы временным и никогда не могло быть связано с входным аргументом ctor:
DoorState(State& state)
тогда нам нужно было бы изменить его на
DoorState(const State& state)
Еще раз спасибо Джароду и Шеффу за указание на проблему.