Вы не можете неявно преобразовать char
в enum
- вы должны сделать это явно:
return curr_tok = static_cast<token_value> (ch);
Но будьте осторожны! Если ни одно из значений enum
не соответствует вашему char
, тогда будет сложно использовать результат :)
Обратите внимание, что приведенные решения (т. Е. Говорящие вам использовать static_cast
) работают правильно только потому, что, когда были определены символы перечисления, символы (например, PLUS
) были определены как имеющие физическое / числовое значение, которое оказывается равным значению базового символа (например, '+'
).
Другой способ (без использования приведения) - использовать операторы switch / case для явного указания значения перечисления, возвращаемого для каждого символьного значения, например:
case '*':
return curr_tok=MUL;
case '/':
return curr_tok=DIV;
Вам нужно явное приведение:
curr_tok = static_cast<token_value>(ch);
Причина в том, что преобразовывать целочисленный тип в перечисление опасно. Если значение недопустимо для перечисления, поведение не определено. Таким образом, язык не позволяет сделать это случайно с помощью неявного преобразования. Явное преобразование должно означать: «Я знаю, что делаю, и я проверил, что значение допустимо».
Думаю, я бы не стал пытаться явно устанавливать значения символов перечисления и вместо этого писать регистр для каждого символа в вашем операторе switch. Сделать это таким образом, вероятно, будет сложнее отлаживать, если что-то пойдет не так, а затраты на производительность при написании регистра для каждого символа настолько низки, что это даже не стоит рассматривать (если вы не пишете для какой-то чрезвычайно низкой встраиваемой системы и, наверное, все равно того не стоит).