覆盖C ++中的运算符重载?

时间:2010-05-19 01:57:51

标签: c++ operator-overloading

helo guys

我有课程调用复杂

我像这样的

进行了操作符重载
Complex c = a + b; // where a and b are object of Complex class 

基本上是operator +(Complex& that);

但我不知道怎么说,例如

double c = a + 10; //where a is object of Complex class but 10 is integer / double  

我确实定义了类型转换为一个双重得到我的IDE说有太多的操作数+并且它以某种方式抱怨无法“理解”+

它必须采用这种格式double c = a + 10;

感谢

错误消息是

Error: more than one operator "+" matches these operands: 
error C2666: 'Rational::operator +' : 3 overloads have similar conversions 

1> could be 'const Complex Complex::operator +(const Complex &)' 1> 
or 'double operator +(const Complex &,double)' 

编译器无法根据签名选择?是的,我确实在课外定义它,因为我在课堂上定义了一个感谢

5 个答案:

答案 0 :(得分:4)

double operator+(const Complex &c, int x)
{
    //....
}

答案 1 :(得分:3)

如何放入表单的构造函数:

 Complex(float _real) : m_Real( _real ), m_Imaginary(0){}

这样可以将任何可投射到float的值作为Complex摄取。然后,您不需要为各种类型创建重载运算符。你为Complex写的那个就足够了。

答案 2 :(得分:2)

您遇到模糊过载错误的原因是,您有operator+个变种,可以添加两个ComplexComplexdouble,但是您重新尝试添加Complexint。编译器无法决定是否更好地将int转换为Complex以使用第一个或double并使用第二个。

为避免这种情况,您需要为可能要添加到operator+的所有可能类型定义重载Complex(int,float,long,unsigned ...)或不重载{ {1}}首先 - 只需定义一个operator+,即添加两个operator+,并让类型转换处理所有其他情况。

答案 3 :(得分:1)

为双操作数重载operator+

double Complex::operator+(double rhs)

答案 4 :(得分:0)

如果您打算这样做,您可能需要执行以下操作。首先,我们定义以下内容(在类之外,以便允许第一个和第二个操作数的隐式转换),不要定义任何其他运算符+,例如operator +(Complex,double):

Complex operator+(const Complex& a, const Complex& b) {
  // ..
}

同时定义一个隐式构造函数:

Complex(double a) : real(a), imag(0) {}

然后定义转换运算符(就像wheaties指出的那样,这可以被认为是一种糟糕的编程习惯,我同意;所以如果不需要最终转换为double,则省略这一点):

operator double() const { return real; }

这将自动支持double c = a_complex + 10;double c = 10 + a_complex;,数字10将使用隐式构造函数隐式转换为Complex,算术将解析为{{1} },结果将自动转换为double。

P.S。您也可以在课程中定义operator+(const Complex&, const Complex&);,并使用它来实现上面的Complex& operator+=(const Complex& o) { /* .. */ }