Перегрузка операторов '<<' & '>>' - PullRequest
1 голос
/ 29 мая 2011

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

friend ostream& operator << (ostream &tmp, Cmplx &param)
{
    tmp<<param.Re<<"+"<<param.Im<<"i";
    return tmp;
}
friend istream& operator >> (istream &tmp, Cmplx &param)
{
    tmp>>param.Re;
    tmp>>param.Im;
    return tmp;
}

Но когда я пытаюсь скомпилировать, я получаю.

no match for 'operator<<' in 'std::cout << Cmplx<vartype>::operator+(Cmplx<vartype>) [with vartype = long double](Cmplx<long double>(((const Cmplx<long double>&)((const Cmplx<long double>*)(& B)))))'

Заранее спасибо

EDIT: Реализация:

#include"cmplx oper.hpp"
using namespace std;

int main()
{
Cmplx<long double> A, B;
cin >> A;
cin >> B;
cout<<(A+B)<<(A-B)<<(A*B)<<(A/B)<<(A+B).norm<<(A+B).pol<<(A+B).conj<<(A+B).re<<(A+B).im<<endl;
getch();
return true;
}

Также в модификации я изменил параметр на const:

friend ostream& operator << (ostream &tmp, Cmplx const &param)
{
    tmp<<param.Re<<"+"<<param.Im<<"i";
    return tmp;
}

Все еще не работает

РЕДАКТИРОВАТЬ 2: Я сломал строку cout и обнаружил, что проблема заключалась в том, что в моем классе была пара методов, а не использование оператора «+». Я до сих пор не знаю, почему, но по крайней мере я мог бы скомпилировать.

Кроме того, мне интересно, могу ли я получить конкретный стиль ввода для своего класса, я имею в виду что-то вроде

scanf("%d+%di",Re,Im);

Но с использованием cin (я не могу или, по крайней мере, не знаю, как использовать scanf, поскольку это шаблон, и довольно неудобно писать конкретный cin для каждого типа данных)

РЕДАКТИРОВАТЬ 3: Я нашел проблему, отсутствие скобок.

1 Ответ

5 голосов
/ 29 мая 2011

Вы не показали, как вы его используете, но в этом случае я вижу, что случилось.

Вы делаете что-то вроде std::cout << (Cmplx1 + Cmplx2);.

Результат (Cmplx1 + Cmplx2) является временным; временные выражения не могут быть связаны со ссылками.

Например:

int f() {
   return 3;
}

int& x = f(); // ill-formed

Однако, как особая часть магии C ++, временные могут быть связаны с references-to-const:

Например:

int f() {
   return 3;
}

int const& x = f(); // magic!

Тогда временный живет столько же, сколько reference-to-const.

Если ваши операторы принимают ссылки на const сложных объектов, то вы можете связать временный параметр как второй параметр:

friend ostream& operator<<(ostream& os, Cmplx const& param)
{
    os << param.Re << "+" << param.Im << "i";
    return os;
}

Для удобства вам следовало бы сделать это в первую очередь, так как вы не будете изменять param (а в operator<< никогда не должны).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...