2012-02-09 4 views
1

Я пытаюсь вернуться на C++, и это моя вторая программа за долгое время. Все компилируется просто peachy, пока он не достигнет cin >> stopat;, где он возвращает то, что кажется довольно распространенной ошибкой: error: no match for 'operator>>' in 'std::cin >> stopat' Я просмотрел несколько вещей, объясняющих, что вызывает это, но я ничего не понимаю (из-за моей относительной неопытности в программировании). Что вызывает эту ошибку и как ее исправить, если я снова натолкнулся на нее?ошибка: нет соответствия для 'operator >>' in 'std :: cin >> stopat'

#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(); 
} 

EDIT: Как-то я не думал связывать ссылки библиотек. Вот они: https://mattmccutchen.net/bigint/

+2

Что такое 'BigInteger'? Похоже, что у него нет оператора '>>'. –

+0

Что такое BigInteger? Если это имя класса, то, конечно, для него нет перегруженного оператора >>. – mikithskegg

ответ

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

Edit: Теперь, когда вы указали библиотеку, которая используется, вот что ты можешь сделать. Сама библиотека должна, вероятно, сделать это для вас, поскольку она предоставляет соответствующий оператор 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

+0

Поскольку я написал свой ответ, OP опубликовал ссылку на настоящую библиотеку, поэтому теперь мы можем точно знать. Я соответствующим образом обновлю ответ. –

0

Что вы оставили здесь есть сведения о вашем BigInteger классе. Чтобы прочитать один из входного потока с помощью оператора >>, вам необходимо определить operator>> (часто называемый экстрактором потока) для вашего класса. Это то, что означает ошибка компилятора.

По сути, то, что вам нужно, это функция, которая выглядит следующим образом:

std::istream &operator>>(std::istream &is, BigInteger &bigint) 
{ 
    // parse your bigint representation there 
    return is; 
} 
Смежные вопросы