ostream的问题

时间:2014-04-26 05:31:16

标签: c++ overloading

我正在使用C ++进行Big Integer实现,我正在尝试将cout与我的BigInt类一起使用。我已经重载了<<运算符,但在某些情况下不起作用。

这是我的代码:

inline std::ostream& operator << (ostream &stream, BigInt &B){

    if (!B.getSign()){
        stream << '-';
    }
    stream << B.getNumber();

    return stream;
}

上面的代码适用于:

c = a + b;
cout << c << endl;

但失败了:

cout << a + b << endl;

在第一种情况下,程序运行正常,但在第二种情况下编译器发出错误:

main.cc: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’

可以重载&lt;&lt;两种情况下的函数运算符?

方法:

string getNumber ();
bool getSign ();

string BigInt::getNumber (){
  return this->number;
}

bool BigInt::getSign (){
  return this->sign;
}

2 个答案:

答案 0 :(得分:2)

正如克里斯已经在评论中非常迅速地指出(像往常一样),你在这里有一个临时的创建:

cout << a + b << endl;

您无法将其绑定到非const引用。您需要通过将const关键字添加到引用来更改运算符重载的签名。

此代码适用于虚拟BigInt实现(因为您尚未共享):

#include <iostream>

using namespace std;

class BigInt
{
    public:
    bool getSign() const { return true; }
    int getNumber() const { return 0; }
    const BigInt operator+(const BigInt &other) const {}
};

inline std::ostream& operator << (ostream &stream, const BigInt &B){
//                                                 ^^^^^
    if (!B.getSign()){
        stream << '-';
    }
    stream << B.getNumber();

    return stream;
}

int main()
{
    BigInt a, b, c;
    c = a + b;
    cout << c << endl;
    cout << a + b << endl;
    return 0;
}

但是,我同意在这种特殊情况下错误信息不能自我解释。

答案 1 :(得分:1)

更改

inline std::ostream& operator << (ostream &stream, BigInt &B){

inline std::ostream& operator << (ostream &stream, BigInt const& B){

c可以在需要BiInt&a+b不能使用的情况下使用,因为a+b是临时的。但它可以在预期BigInt const&的地方使用。