一个关于重载流插入运算符的有关问题

一个关于重载流插入运算符的问题
#include<iostream>
using namespace std;
class Complex
{public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator+(Complex &c2);
friend ostream  operator <<(ostream &,Complex&);
private:
double imag;
double real;
};
Complex Complex::operator+(Complex&c2)
{return Complex(real+c2.real,imag+c2.imag);}
ostream operator <<(ostream &output,Complex &c)
{  output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
return output;
}
int main()
{
Complex c1(2,4),c2(6,10),c3;
c3=c1+c2;
cout<<c3;
return 0;
}

1>  源.cpp
1>f:\vs2012_ult_chs\vc\vcprojects\consoleapplication6\consoleapplication6\源.cpp(17): error C2248: “std::basic_ostream<_Elem,_Traits>::basic_ostream”: 无法访问 private 成员(在“std::basic_ostream<_Elem,_Traits>”类中声明)
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          f:\vs2012_ult_chs\vc\include\ostream(82) : 参见“std::basic_ostream<_Elem,_Traits>::basic_ostream”的声明
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
要怎么修改才可以运行成功?

Visual Studio 2012

------解决方案--------------------
这个好像是VC6.0有的bug,试试这样行不行

#include<iostream>
using namespace std;
class Complex;//声明类,因为下面函数声明要用
ostream& operator<<(ostream &cout,Complex &c);//声明函数,加上这句对函数进行声明
class Complex
{
public:
Complex()
{
real=0;imag=0;
}
Complex(double r,double i)
{
real=r;imag=i;
}
public:
friend ostream& operator<<(ostream &cout,Complex &c);
private:
double imag;
double real;
};
ostream& operator <<(ostream &cout,Complex &c)
{  
cout<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
return cout;
}

int main()
{
Complex c1(2,4),c2(6,10),c3;
cout<<c1;
return 0;
}