Вопрос:
Я пытаюсь перегрузить оператор >>. У меня есть класс, который имеет две частные переменные:
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.