Enum to unsigned int

У меня есть следующий код:

class mph {
public:
enum minute_periods {five, ten, fifteen, thirty}; 
 std::vector<minute_periods> factors;
 minute_periods fac;
void setUpFactors(void) { 
 factors.resize(4);
 factors[five] = 5;
 factors[ten] = 10;
 factors[fifteen] = 15;
 factors[thirty] = 30;
 }
</minute_periods>

и я получаю следующую ошибку:

error: invalid conversion from ‘int’ to ‘mph::minute_periods’

как я могу это исправить?

6 ответов

int неявно прикладываются к enum s, вам нужно сделать это явно, поэтому вы получаете ошибку. Я не думаю, что этот код будет делать то, что вы хотите, но похоже, что вы хотите что-то вроде этого.

std::map<minute_periods, int=""> factors;
</minute_periods,>

Таким образом, factors[five] предоставит вам int, а не enum, как этот вектор. Я предполагаю, что это ваш код, потому что значения 5, 10, 15 и 30 находятся вне диапазона enum (от 0 до 3).


В С++ вы можете неявно отбрасывать от enum до int, но не наоборот. Вы можете исправить это, используя явные приведения:

factors.resize(4);
factors[five] = minute_period(5);
factors[ten] = minute_period(10);
factors[fifteen] = minute_period(15);
factors[thirty] = minute_period(30);

Надеюсь, это поможет!


Ваш код заставляет эту ошибку генерировать в двух местах:

  • когда вы используете значения enum в качестве показателей vector
  • когда вы используете значения enum как значения в этом векторе

Ваша логика ошибочна. vector всегда индексируется целыми числами. Дикая догадка заключалась в том, что вы хотели map, но со второй мыслью - это не имеет никакого смысла.

Чтобы использовать значения enum как целые числа, просто выполните:

enum minute_periods 
{
 five = 5, 
 ten = 10, 
 fifteen = 15, 
 thirty = 30
};

Это правильный способ использовать значения enum как целые числа - не какая-то глупая структура данных, преобразующая метки в значения.


Вы можете преобразовать только enum в ints, а не ints для перечисления. Поскольку ваш вектор представляет собой список минутных периодов, вы должны назначать только минуты. Вероятно, вы хотите

factors[five] = five;
factors[ten] = ten;
factors[fifteen] = fifteen;
factors[thirty] = thirty;

Это решит вашу ошибку компиляции.


Вы хотите использовать map не a vector. Так как выглядит то, что вы храните, это карта из перечисления в целое число, а не вектор minute_periods

class mph {
public:
enum minute_periods {five, ten, fifteen, thirty}; 
 std::map<minute_periods, int=""> factors;
void setUpFactors(void) { 
 factors[five] = 5;
 factors[ten] = 10;
 factors[fifteen] = 15;
 factors[thirty] = 30;
 }
};
</minute_periods,>

Также вы можете просто указать, для чего явно заданы значения перечисления:

class mph {
 public:
 enum minute_periods {five = 5, ten = 10, fifteen = 15, thirty = 30}; 
};


Вам нужно объявить свой вектор как std::vector<unsigned int=""> factors;</unsigned>, если вы хотите сделать это таким образом. Если вы преобразовываете перечисление в другое значение через вектор, тип значения вектора должен быть типом, в который вы конвертируете. Поиск можно выполнить с перечислением как индексом через неявное преобразование.

Я также предлагаю определить значение перечисления count как последнюю запись в вашем списке значений перечисления. Он может заменить жесткий код.

licensed under cc by-sa 3.0 with attribution.