нет оператора >> соответствует этим операндам

Вопрос: Я пытаюсь перегрузить оператор >>. У меня есть класс, который имеет две частные переменные: Class Complex { private: double real; double imaginary; }; Кроме того, у меня есть функция friend, которая перегружает оператор >>: friend istream & operator>>(istream &is, Complex &c) В реализации функции я пробовал много способов записи в переменную объекта c но

Вопрос:

Я пытаюсь перегрузить оператор >>. У меня есть класс, который имеет две частные переменные:

Class Complex { private: double real; double imaginary; };

Кроме того, у меня есть функция friend, которая перегружает оператор >>:

friend istream & operator>>(istream &is, Complex &c)

В реализации функции я пробовал много способов записи в переменную объекта c но я продолжаю получать ошибку, no operator >> matches these operands

Я огляделся и прочитал, что мне нужно написать reference на переменную, поэтому я попробовал следующее:

istream & operator>>(istream &is, Complex &c) { using std::cout; double &r = c.real; cout << «real: » << is >> r; return is; }

Однако это все равно дает мне ту же ошибку. Я немного смущен, так как пытался is >> c.real и не работал.

На одном из ответов в аналогичном SO-вопросе кто-то предложил записать в локальную переменную и установить переменную объекта, что-то вроде:

double d; cin >> d; setReal(d);

Я пытаюсь найти более простой способ добиться этого, а не использовать метод или установить переменную на локальную.

Решение может быть простым, но я действительно новичок в C++, поэтому, пожалуйста, успокойтесь: P.

Прецедент:

using std::cin; Complex c; cin >> c;

Точное сообщение об ошибке:

Error 1 error C2678: binary ‘>>’ : no operator found which takes a left-hand operand of type ‘std::basic_ostream<_Elem,_Traits>’ (or there is no acceptable conversion) Лучший ответ:

Ошибка в этой строке:

cout << «real: » << is >> r;

Это интерпретируется как

((cout << «real: «) << is) >> r

Проблема здесь заключается в том, что вы не можете иметь такую строку, где вы переключаетесь от вывода на cout и начать чтение is. Лучшим способом сделать это будет

cout << «real: «; is >> r;

Тем не менее, это очень плохая идея. У вас не должно быть operator >> отображать подсказку, так как это означает, что если вы хотите читать объект своего типа из файла, каждый раз, когда вы это делаете, вы получите подсказку ” real “, отображаемую на экране. У вас должен быть operator >> просто прочитать представление и явно запросить перед чтением, если это то, что вы хотите сделать.

Надеюсь это поможет!

Ответ №1

Ошибка в этой строке:

cout << «real: » << is >> r;

Вы имели в виду использовать << вместо >> на этом последнем? Поскольку вы использовали >>, он пытается написать “is” в cout, но нет перегрузки оператора <<, который принимает basic_ostream и basic_istream.

Оцените статью
Добавить комментарий