为什么运算符<<对于test2 + test3不能超载?

时间:2019-08-09 13:11:33

标签: c++ class c++11 operator-overloading friend-function

我尝试使operator<<重载,但是有警告我不能重载它。我可以按如下方式重载该运算符:

std::cout << test4 << std::endl;

但是我不能按如下方式重载它:

std::cout << test2 + test3 << std::endl;

我的主要代码是:

Stonewt test2(2, 8, Stonewt::STONE);
std::cout << "test2: " << test2 << std::endl;

Stonewt test3(2, 3, Stonewt::POUNDS);

std::cout << "test3: " << test3 << std::endl;

Stonewt test4 = test2 + test3;
std::cout << test4 << std::endl;         // operator << can overload
std::cout << test2 + test3 << std::endl; // operator << cannot overload

下面是friend函数

std::ostream& operator <<(std::ostream& os, Stonewt& a)
{
    if (a.format == Stonewt::STONE)
    {
        os << "stone format" << '\n';
        os << a.stone << " stones " << a.pound << " pounds" << '\n';
    }
    else if (a.format == Stonewt::POUNDS)
    {
        os << "pounds format" << '\n';
        os << a.pounds << " pounds" << '\n';
    }
    else
        os << "not valdid" << '\n';
    return os;
}

2 个答案:

答案 0 :(得分:5)

test2+test3生成一个临时Stonewt对象( rvalue ),该对象无法绑定到non-const引用( lvalue ) :即Stonewt &a),而是带有const限定的 lvalue 引用。因此,将非成员函数更改为:

std::ostream & operator <<(std::ostream &os, const Stonewt &a)
//                                           ^^^^^^^^^^^^^^^^
{
      // ....
      return os;
}

更多读数:

答案 1 :(得分:0)

这不是运算符<<对于test2 + test3不起作用。它缺少运算符+。

您需要使operator +重载,以便'test2 + test3'起作用。 operator <<的重载正在工作,但是编译器不知道遇到“ test2 + test3”时该怎么办,从而发出假定的错误。