ошибка: нет совпадения для 'operator >>' в 'std :: cin >> stopat' - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь вернуться в C ++, и это моя вторая программа за долгое время. Все компилируется просто замечательно, пока не дойдет до cin >> stopat;, где он возвращает то, что кажется довольно распространенной ошибкой: error: no match for '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();
}

РЕДАКТИРОВАТЬ: Почему-то я не думал связывать библиотеки, на которые ссылаются. Вот они: https://mattmccutchen.net/bigint/

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Вы не показали нам код для 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 голосов
/ 10 февраля 2012

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

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

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