2012-02-09 136 views
1

我試圖回到C++,這是我很久以前的第二個程序。一切編譯只是桃色,直到它到達cin >> stopat;它返回什麼似乎是一個相當常見的錯誤:error: no match for 'operator>>' in 'std::cin >> stopat' 我已經通過幾件事情來解釋是什麼導致這一點,但我沒有真正理解(由於我在編程方面相對缺乏經驗)。導致此錯誤的原因是什麼,如果我再次遇到它,我該如何修復它?錯誤:'std :: cin >> stopat'中的'operator >>'不匹配'

#include <iostream> 
#include "BigInteger.hh" 

using namespace std; 

int main() 
{ 
    BigInteger A = 0; 
    BigInteger B = 1; 
    BigInteger C = 1; 
    BigInteger D = 1; 
    BigInteger stop = 1; 
    cout << "How Many steps? "; 
    BigInteger stopat = 0; 
    while (stop != stopat) 
    { 
     if (stopat == 0) 
     { 
      cin >> stopat; 
      cout << endl << "1" << endl; 
     } 
     D = C; 
     C = A + B; 
     cout << C << endl; 
     A = C; 
     B = D; 
     stop = stop + 1; 
    } 
    cin.get(); 
} 

編輯:不知何故,我不認爲鏈接引用的庫。在這裏,他們是:https://mattmccutchen.net/bigint/

是一個函數定義
+2

什麼是'BigInteger'?似乎它沒有'>>'操作符。 – 2012-02-09 23:32:51

+0

什麼是BigInteger?如果它是類的名稱,那麼肯定沒有重載的操作符>>。 – mikithskegg 2012-02-09 23:33:10

回答

2

您還沒有表現出我們的BigInteger的代碼,但是有需要(在BigInteger.hh或在自己的代碼)是這樣的:

std::istream& operator >>(std::istream&, BigInteger&); 

這個函數需要被實現來真正從一個流中獲取一個「單詞」,並嘗試將它轉換爲一個BigInteger。如果你運氣好,BigInteger的將有一個構造函數的字符串,在這種情況下,它會是這樣:

std::istream& operator >>(std::istream& stream, BigInteger& value) 
{ 
    std::string word; 
    if (stream >> word) 
     value = BigInteger(word); 
} 

編輯:現在你已經指出了所使用的圖書館,這裏是你可以做。庫本身應該爲你做這件事,因爲它提供了相應的ostream操作符,但是如果你研究一下,你會看到通用的,圖書館級的流操作符比我在這裏寫的更復雜。

#include <BigIntegerUtils.hh> 

std::istream& operator >>(std::istream& stream, BigInteger& value) 
{ 
    std::string word; 
    if (stream >> word) 
     value = stringToBigInteger(word); 
} 
+0

'value = BigInteger(word)'可能涉及不必要的副本,因爲'BigInteger'類肯定有一個成員函數來解析字符串中的數字(至少它提供了這樣的構造函數是有意義的)。 – Xeo 2012-02-10 06:42:33

+0

由於我寫了我的答案,OP發佈了一個鏈接到有問題的實際庫,所以現在我們可以肯定知道。我會相應地更新我的答案。 – 2012-02-10 09:06:13

0

您在此處遺漏的是您的BigInteger課程的詳細信息。爲了使用>>運算符從輸入流中讀取一個,您需要爲您的類定義operator>>(通常稱爲流提取器)。這就是你得到的編譯器錯誤的意思。

從本質上講,你需要的是一個類似如下的功能:

std::istream &operator>>(std::istream &is, BigInteger &bigint) 
{ 
    // parse your bigint representation there 
    return is; 
}