通过具有重载操作符函数的构造函数自动进行类型转换

时间:2016-03-23 16:34:55

标签: c++

我遇到了麻烦。

#include <iostream>
#include <cstdlib>
using namespace std;

class rec
{
private:
    float l;
    float w;
public:
    rec(): l(0) , w(0) {}
    rec(float a)
    {
        l = a;
        w = 0.0;
    }
    rec(float a, float b): l(a) , w(b) {}
    friend rec operator +(rec& , rec&);
    //friend rec operator +(float , rec&);
    friend ostream& operator <<(ostream&, rec&);
};

ostream& operator <<(ostream& out , rec& r3)
{
    out << "l " << r3.l << endl << "w " << r3.w;
    return out;
}

int main()
{
    rec r1(8, 3) , r2(2,7) , r3;
    r3 = 5.0 + r2;
    cout << "sum " << r3;
}

rec operator +(rec r1 , rec r2)
{
    float lsum , wsum;
    lsum = r1.l + r2.l;
    wsum = r1.w + r2.w;
    return rec(lsum , wsum);
}

我认为这里的自动类型转换的目的是使其成为可能 r3 = 5.0 + r2 其中5.0被视为要在重载+和&lt;&lt;中使用的对象函数使朋友rec操作符+(float,rec&amp;); 不必要。 也许我在这里遗漏了一些东西。

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题。首先,friend rec operator +(rec& , rec&);将声明一个operator+,它对其参数进行非const引用。通过构造函数从floatrec的转换将产生一个临时的,而非const引用不能绑定到临时的。您应该通过按值或const引用接受参数来修复它。

第二个问题是operator+的定义与它的当前声明不匹配。