2012-11-29 72 views
0

我使用这个类复杂的程序来解析方程无法理解的iostream错误

class complex 
{ 
    double real; 
    double imag; 
    stringstream complexStr; 

public: 
    complex(double re = 0, double im = 0) 
    { 
     real = re; 
     imag = im; 
     complexStr<<real<<"+j"<<imag; 
    } 

    complex(complex &t) 
    { 
     real = t.real; 
     imag = t.imag; 
    } 

    void StrtoComplex(char *temp) 
    { 
     int i; 

     for(i = 0; i < strlen(temp); i++) 
      if(temp[i] == 'j' || temp[i] == 'i') 
       break; 

     real = atof(temp);//takes till the last valid char so after + or whitespace it ignores 
     imag = atof(temp + i + 1); 

     complexStr<<real<<"+j"<<imag; 
    } 

    friend complex operator+(complex &a, complex &b); 
    friend complex operator-(complex &a, complex &b); 
    friend complex operator-(complex &a); 
    friend complex operator*(complex &a, complex &b); 
    friend complex operator/(complex &a, complex &b); 
    friend ostream &operator<<(ostream &s, complex &t); 
    friend istream &operator>>(istream &s, complex &t); 
}; 

//overloading + to add complex numbers 
complex operator +(complex &a, complex &b) 
{ 
    complex t; 
    t.real = a.real + b.real; 
    t.imag = a.imag + b.imag; 
    return(t); 
} 
//overaloading - to subtract 2 complex no's 
complex operator -(complex &a, complex &b) 
{ 
    complex t; 
    t.real = a.real - b.real; 
    t.imag = a.imag - b.imag; 
    return(t); 
} 

//overloading unary - 
complex operator -(complex &a) 
{ 
    complex t(-a.real, -a.imag); 
    return(t); 
} 

//overloading * to multiply 2 complex no's 
complex operator *(complex &a, complex &b) 
{ 
    complex t; 
    t.real = (a.real*b.real) - (a.imag*b.imag); 
    t.imag = (a.real*b.imag) + (a.imag*b.real); 
    return(t); 
} 
//overloading/to divide 2 complex no's 
complex operator /(complex &a, complex &b) 
{ 
    complex t; 
    t.real = ((a.real*b.real) + (a.imag*b.imag))/(b.real*b.real + b.imag*b.imag); 
    t.imag = ((a.real*b.imag) - (a.imag*b.real))/(b.real*b.real + b.imag*b.imag); 
    return(t); 
} 

ostream &operator<<(ostream &s, complex &t) 
{ 
    s<<t.complexStr.str(); 
    return s; 
} 

istream &operator>>(istream &s, complex &t) 
{ 
    char *temp; 

    s>>temp; 
    t.StrtoComplex(temp); 
    return s; 
} 

,我收到此错误:

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   This diagnostic occurred in the compiler generated function 'std::basic_stringstream<_Elem,_Traits,_Alloc>::basic_stringstream(const std::basic_stringstream<_Elem,_Traits,_Alloc> &)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char>, 
1>    _Alloc=std::allocator<char> 
1>   ] 

请帮我试图寻找身边但答案似乎是特定于该程序,所以发布了这个问题。

+1

无法重新创建,建立良好的VS 2010? – acraig5075

回答

5

您的complex班有一个std::stringstream的成员。当编译器生成complex的拷贝构造函数时,它将尝试调用std::stringstream的拷贝构造函数。但是这个失败,因为stringstream对象不能被复制。

我建议你删除stringstream成员,只需在operator<<中将所需字段写入输出流即可。如果要使字符串表示成为该类的成员,请改用std::string成员。

如果你真的想有一个stringstream成员(不推荐),你需要创建自己的拷贝构造函数,而不是编译器生成一个。

+0

+1,这正是发生了什么事。 – billz

+0

如果我将'complexStr = t.complexStr'添加到复制构造函数,我只会得到错误。没有它,并根据OP的代码,VS 2010构建的片段就好了? – acraig5075

+0

@ acraig5075:哦,我没有注意到,有一个拷贝构造函数存在。但请注意,OP的拷贝构造函数需要一个非const引用,所以不能复制临时对象。这个问题也可能会被代码使用OP还没有发布的'complex'类引起的。 – interjay