Я копирую и вставил некоторый код, который увеличивает перечисление:
myenum++;
Этот код хорошо работал, поскольку он был скомпилирован в VS.NET C++ 2003
Я теперь разрабатываю в VS 6.0 и получаю ошибку:
ошибка C2676: двоичный файл '++': 'перечислимый идентификатор' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора
Как я могу заставить это вести себя то же в 6,0?
Пожалуйста, попробуйте преобразовать в int, добавить единицу (+1) и преобразовать обратно в enum.
Я не вижу ничего плохого в определении оператора++ на хорошо понятном перечислении. Разве не в этом цель перегрузки операторов? Если контекст не имеет смысла (например, перечисление с дырами в нем), то, конечно, это не имеет смысла. Определение operator* для класса под названием Complex, реализующего комплексные числа, - это не просто правильное, а отличное применение перегрузки математических операторов в C++!
Если разработчик определяет перечисление, где operator++ имеет очевидный и интуитивный смысл для клиентов этого перечисления, то это хорошее применение перегрузки оператора.
enum DayOfWeek {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
inline DayOfWeek operator++(DayOfWeek &eDOW, int)
{
const DayOfWeek ePrev = eDOW;
const int i = static_cast<int>(eDOW);
eDOW = static_cast<DayOfWeek>((i + 1) % 7);
return ePrev;
}
перечисление может быть интегральным, но не Это не значит, что он охватывает непрерывный диапазон.
Это
enum {
A,
B,
C,
}
май По умолчанию будет
enum {
A = 0,
B = A + 1,
C = B + 1,
}
, поэтому вы можете избежать наказания с помощью
int a = A;
a++;
. Однако, если у вас есть
enum {
A = 2,
B = 4,
C = 8,
}
, +1 не сработает.
Итак, если бы у вас также были такие вещи, как
enum {
FIRST,
A = FIRST,
B,
C,
LAST = C
}
, тогда при повторении перечисления вы бы дважды выполняли A и C?
Какова цель повторения перечисления? вы хотите сделать «для всех» или для некоторого подмножества, есть ли на самом деле порядок в перечислении?
Я бы бросил их все в контейнер и повторил бы его вместо