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)'
编译器无法根据签名选择?是的,我确实在课外定义它,因为我在课堂上定义了一个感谢
答案 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+
个变种,可以添加两个Complex
或Complex
和double
,但是您重新尝试添加Complex
和int
。编译器无法决定是否更好地将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) { /* .. */ }
。