Проблема в том, что dt + dt
оценивается до выполнения cout << "Addition: "
.
std::ostream
не имеет методов с одним параметром operator<<
, которые принимают const char[]
или Date
в качестве входных данных, поэтому вместо этого он должен вызывать перегрузки, не являющиеся членами operator<<
. Таким образом, выражение cout << "Addition: " << dt + dt;
в конечном итоге выглядит для компилятора следующим образом:
operator<<(operator<<(cout, "Addition: "), dt + dt);
Во внешнем вызове operator<<
ваш компилятор выбирает оценку второго параметра (dt + dt
) перед вычислением первого параметра (operator<<(cout, "Addition: ")
).
Вы не сможете получить желаемый результат, не изменив main()
, чтобы изменить порядок оценок, чтобы принудительно установить желаемый порядок, например:
#include <iostream>
using namespace std;
class Date {
int mo, da, yr;
public:
Date(int m, int d, int y) {
mo = m;
da = d;
yr = y;
}
friend ostream & operator << (ostream & os, const Date & dt) {
os << dt.mo << '/' << dt.da << '/' << dt.yr;
return os;
}
Date operator + (const Date & dat) const {
Date newDate(dat.mo + mo, dat.da + da, dat.yr + yr);
cout << *this << "+" << dat << "=";
return newDate;
}
};
int main() {
Date dt(5, 6, 92);
cout << "Addition: ";
cout << dt + dt;
}
Хотя, как правило, было бы лучше вообще удалить выходную печать из вашего operator+
, просто дайте main()
распечатать, как хотите:
#include <iostream>
using namespace std;
class Date {
int mo, da, yr;
public:
Date(int m, int d, int y) {
mo = m;
da = d;
yr = y;
}
friend ostream & operator << (ostream & os, const Date & dt) {
os << dt.mo << '/' << dt.da << '/' << dt.yr;
return os;
}
Date operator + (const Date & dat) const {
return Date(dat.mo + mo, dat.da + da, dat.yr + yr);
}
};
int main() {
Date dt(5, 6, 92);
Date sum = dt + dt;
cout << "Addition: " << dt << "+" << dt << "=" << sum;
}