Проблема в вашем коде заключается в том, что вы пытаетесь установить параметр типа шаблона, используя значение времени выполнения, а не значение времени компиляции.
Class* a = new A(AllowedType(1)) // The call to new here makes 'type' below a runtime value
b->ability<AllowedTypes::Cat>(); // AllowedTypes::Cat can be supplied at compile time
AllowedTypes type = (AllowedTypes)*a; // this converts correctly!
b->ability<type>(); //does not call correctly
Вот ваш код, работающий онлайн которая указывает на точную проблему.В следующий раз, когда вы запутались в том, почему ваш тип шаблона не выводится правильно / выдает ошибку, используйте constexpr
, чтобы выяснить, почему.
А вот ответ, объясняющий, почему new
приводит к неправильной форме constexpr
: C ++ 14: можете ли вы вызвать new в constexpr?