C/C++

Ошибка (активно) E0511 для этой операции с перечисляемым типом требуется соответствующая

определяемая пользователем функция оператора
"#include "stro.h"

enum class Month {
jan=1,feb,mar,apr,may,jun,
jul,aug,sep,oct,nov,dec
};

class Date {
public:
Date(int dd, Month mm, int yy);

void add_day(int n);
void add_month(int n);
void add_year(int n);

int day() const { return d; }
Month month() const { return m; }
int year() const { return y; }

private:
int d;
Month m;
int y;
};

Date::Date(int dd, Month mm, int yy)
{
if ((dd > 0 && dd < 32) && ((int)mm > 0 && (int)mm < 13))
{
d = dd;
m = mm;
y = yy;
}
}

void Date::add_day(int n) {
d += n;
}

void Date::add_month(int n) {
m+=n;
}

void Date::add_year(int n) {
y += n;
}

ostream& operator<<(ostream& os, Date& d) {
return os << '(' << d.day ()
<< ',' << int(d.month()) << ','
<< d.year() << ')';
}

int main()
{
setlocale(0, "");

Date today(4,Month::sep,2003);
const Date cd{ 8,Month::jun,2004 };

today.add_day(1);
//cd.add_day(1);
}"
Почему бы не оставить перечислители в покое и хранить числа в переменных для чисел - например int? Там уж все арифметические операции доступны (даже += ). Тем более что все эти названия месяцев (jan, apr...) сгорят при компиляции и нужны только чтобы упростить запоминание циферок.
Для возможности ввода пользователем даты вида 15 jan 2005 это не подходит.
Мехрулло Каримов
Мехрулло Каримов
51 416
Лучший ответ
Ильдус Халимов этот код из книги, т.е. используется как учебный)
Ильдус Халимов я исправил, добавив: "void operator+=(Month& y, int n) {
y += n;
}
"
 m = static_cast((static_cast(m) - 1 + n) % 12 + 1) 
с другой стороны - а почему год не двигается...
Ec
Ecko_Kz
36 952
Похоже, что это сообщение об ошибке указывает на то, что во фрагменте кода отсутствует соответствующая определяемая пользователем операторная функция. Это может означать, что фрагмент кода неполный или что для правильной работы фрагмента требуются дополнительные функции. Возможно, стоит просмотреть остальную часть кода, чтобы увидеть, есть ли какие-либо другие ошибки или проблемы, а затем попытаться изолировать источник проблемы и реализовать решение. Если вы все еще пытаетесь решить проблему, может быть хорошей идеей обратиться за помощью к кому-то с большим опытом кодирования, чтобы он помог устранить фрагмент кода, который вызывает ошибку.
E0511 возникает в вашем коде при вызове функции cd.add_day(1) в main() функции, потому что объявили cd как const Date.Вы не можете изменять его состояние. Попытка вызова add_day на cd приведет к ошибке компиляции.
 Date cd{ 8,Month::jun,2004 }; 
cd.add_day(1);
Вот так должно работать
Если выводить дату в поток ostream, вы должны определить оператор вывода operator<< для класса Date. Добавить в Date
 friend std::ostream& operator
Ильдус Халимов так я закомментил cd