2014-04-26 73 views
1

我正在C++的大整數實現中工作,我試圖用我的BigInt類使用cout。我已經超載了< <運營商,但在某些情況下它不起作用。ostream的問題

這裏是我的代碼:

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>&&’ 

在兩種情況下,都可能過載運算符的功能嗎?

方法:

string getNumber(); 
bool getSign(); 

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

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

這個錯誤似乎有點偏離,但是你不能將一個臨時的BigInt綁定到一個非const引用。把它作爲一個const引用;你不需要修改它。 – chris

回答

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; 
} 

但是,是的,我同意,錯誤消息不言自明在這種特殊情況下。

+0

感謝您的回答。我現在得到這個錯誤: bigint.h:64:17:錯誤:作爲'bool BigInt :: getSign()'的'this'參數傳遞'const BigInt'丟棄限定符[-fpermissive] – Guilherme

+0

@Guilherme:你有一個使用非const方法的const對象。那很不好。請使getSign爲const,或者在可行的情況下使用可變的變量,或者在那裏創建一個非const的BigInt。查看我的get方法的常量修飾符,這些方法對於您的缺少。 – lpapp

+0

謝謝,這工作!我以錯誤的方式宣佈了該方法。 bool getSign const() - > bool getSign()const。 – Guilherme

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