关于+=运算符重载的有关问题

关于+=运算符重载的问题
为啥cout<<c2+=5;编译要报错,而写成c2+=5;cout<<c2;就没错?
以下是正确的代码 是c2+=5;cout<<c2;  就是不知道为啥写成cout<<c2+=5;时编译要报错
#include <iostream.h>
#include <stdlib.h>

int Days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int Days2[14]={0,31,31,28,31,30,31,30,31,31,30,31,30,31};

class CDate
{
public:
CDate(int year=2013,int month=1,int day=1):Year(year),Month(month),Day(day){}
bool IsLeapYear(int year);
void SetTime();
CDate &operator++();
CDate operator++(int);
CDate &operator--();
CDate operator--(int);
CDate &operator+=(int right);
CDate &operator-=(int right);
friend CDate operator+(const CDate &c,int x);
friend CDate operator-(const CDate &c,int x);
friend istream &operator>>(istream &input,CDate &c);
friend ostream &operator<<(ostream &output,const CDate &c);
friend bool operator==(const CDate &c1,const CDate &c2);
friend bool operator!=(const CDate &c1,const CDate &c2);
friend bool operator<(const CDate &c1,const CDate &c2);
friend bool operator>(const CDate &c1,const CDate &c2);
friend bool operator<=(const CDate &c1,const CDate &c2);
friend bool operator>=(const CDate &c1,const CDate &c2);
private:
int Year,Month,Day;
};

bool CDate::IsLeapYear(int year)
{
return ((year%4==0&&year%100!=0)||year%400==0);
}

void CDate::SetTime()
{
cout<<"Please enter a date:";
cin>>Year>>Month>>Day;
if (IsLeapYear(Year))
Days[2]=29;
if (Month<1||Month>12)
{
cout<<"The date is not valid"<<endl;
exit(1);
}
if (Day<1||Day>Days[Month])
{
cout<<"The date is not valid."<<endl;
exit(1);
}
cout<<"Set the date successfully!"<<endl;
}

CDate &CDate::operator++()
{
Day++;
if (IsLeapYear(Year))
Days[2]=29;
else
Days[2]=28;
if (Day>Days[Month])
{
Month++;
Day=1;
if (Month>12)
{
Month=1;
Year++;
}
}
return *this;
}

CDate CDate::operator++(int)
{
CDate old=*this;
++(*this);
return old;
}

CDate &CDate::operator--()
{
Day--;
if (IsLeapYear(Year))
Days[2]=29;
else
Days[2]=28;
if (Day==0)
{
Month--;
if (Month==0)
{
Month=12;
Year--;
}
Day=Days[Month];
}
return *this;
}

CDate CDate::operator--(int)
{
CDate old=*this;
--(*this);
return old;
}

CDate &CDate::operator+=(int right)
{
Day+=right;
while (Day>Days[Month])
{
if (IsLeapYear(Year))
Days[2]=29;
else
Days[2]=28;
Day-=Days[Month];
Month++;
if (Month>12)
{
Month=1;
Year++;
}
}
return *this;
}

CDate &CDate::operator-=(int right)
{
Day-=right;
while (Day<=0)
{
if (IsLeapYear(Year))
Days[2]=29;
else
Days[2]=28;
Day+=Days[Month];
Month--;
if (Month==0)
{
Month=12;
Year--;
}
}
return *this;
}

CDate operator+(const CDate &c,int x)
{
CDate temp=c;
temp.Day+=x;
while (temp.Day>Days[temp.Month])
{
if (temp.IsLeapYear(temp.Year))
Days[2]=29;
else
Days[2]=28;
temp.Day-=Days[temp.Month];
temp.Month++;
if (temp.Month>12)
{
temp.Month=1;
temp.Year++;
}
}
return temp;
}

CDate operator-(const CDate &c,int x)
{
CDate temp=c;
temp.Day-=x;
while (temp.Day<=0)
{
if (temp.IsLeapYear(temp.Year))
Days2[3]=29;
else
Days2[3]=28;
temp.Day+=Days2[temp.Month];
temp.Month--;
if (temp.Month==0)
{
temp.Month=12;
temp.Year--;
}
}
return temp;
}

istream &operator>>(istream &input,CDate &c)
{
input>>c.Year>>c.Month>>c.Day;
return input;
}

ostream &operator<<(ostream &output,const CDate &c)
{
output<<c.Year<<"/"<<c.Month<<"/"<<c.Day<<endl;
return output;
}

bool operator==(const CDate &c1,const CDate &c2)
{
if (c1.Year==c2.Year&&c1.Month==c2.Month&&c1.Day==c2.Day)
return true;
else
return false;
}

bool operator!=(const CDate &c1,const CDate &c2)