Problems with ostream

Problems with ostream

本文关键字:ostream with Problems      更新时间:2023-10-16

我正在C++中实现一个Big Integer,并尝试将cout与我的BigInt类一起使用。我已经使<lt;运算符,但在某些情况下不起作用。

这是我的代码:

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;函数的运算符?

方法:

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

正如chris在评论中很快(像往常一样)指出的那样,您在这里创建了一个临时的:

cout << a + b << endl;

不能将其绑定到非常数引用。您需要通过在引用中添加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;
}

但是,是的,我同意在这种特殊情况下,错误消息并不是不言自明的。

更改

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&的地方。