Перегрузка <<
От: O-Sam Россия  
Дата: 19.07.04 18:01
Оценка:
Читал книги. Видел много однотипных примеров. Везде написано делать так:

#include <iostream>
using namespace std;

class Complex
{
    double re;
    double im;
public:
    Complex (double re, double im);
    friend ostream& operator<< (ostream& s, const Complex& z);
};

Complex::Complex (double re, double im)
{
    this->re = re;
    this->im = im;
}

ostream& operator<< (ostream& s, Complex& z)
{
    return s << '(' << z.re << ',' << z.im << ')';
}


void main(void)
{
    Complex a(1.2,0.2);
    cout << "a=" << a;
}


Однако,

Z:\Coding\Cpp\iotest\main.cpp(23) : error C2248: 're' : cannot access private member declared in class 'Complex'
Z:\Coding\Cpp\iotest\main.cpp(6) : see declaration of 're'
Z:\Coding\Cpp\iotest\main.cpp(23) : error C2248: 'im' : cannot access private member declared in class 'Complex'
Z:\Coding\Cpp\iotest\main.cpp(7) : see declaration of 'im'

Почему? Ведь friend же??
Re: Перегрузка <<
От: GarryIV  
Дата: 19.07.04 18:06
Оценка: 1 (1) +1
Hello, O-Sam!
You wrote on Mon, 19 Jul 2004 18:01:43 GMT:

O> Читал книги. Видел много однотипных примеров. Везде написано делать так:


O>
 O> #include <iostream>
 O> using namespace std;

 O> class Complex
 O> {
 O>  double re;
 O>  double im;
 O> public:
 O>  Complex (double re, double im);
 O>  friend ostream& operator<< (ostream& s, const Complex& z);
 O> };

 O> Complex::Complex (double re, double im)
 O> {
 O>  this->re = re;
 O>  this->im = im;
 O> }

 O> ostream& operator<< (ostream& s, const Complex& z)
 O> {
 O>  return s << '(' << z.re << ',' << z.im << ')';
 O> }


With best regards, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 beta
WBR, Igor Evgrafov
Re[2]: Перегрузка <<
От: javabear  
Дата: 19.07.04 20:38
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Hello, O-Sam!

GIV>You wrote on Mon, 19 Jul 2004 18:01:43 GMT:

O>> Читал книги. Видел много однотипных примеров. Везде написано делать так:


O>>
 O>> #include <iostream>
 O>> using namespace std;

 O>> class Complex
 O>> {
 O>>  double re;
 O>>  double im;
 O>> public:
 O>>  Complex (double re, double im);
 O>>  friend ostream& operator<< (ostream& s, const Complex& z);
 O>> };

 O>> Complex::Complex (double re, double im)
 O>> {
 O>>  this->re = re;
 O>>  this->im = im;
 O>> }

 O>> ostream& operator<< (ostream& s, const Complex& z)
 O>> {
 O>>  return s << '(' << z.re << ',' << z.im << ')';
 O>> }
GIV>


GIV>With best regards, Igor Evgrafov.


Не, все совсем не так
там дело в определении оператора << оно каким то образом не совпадает с задекларированным в классе friend?
Тем не менее если убрать using namespace std и везде где нодо прописать std:: то все работает
#include <iostream>
using namespace std;


class Complex
{
friend std::ostream& operator<< (std::ostream& s,const Complex& z);
double re;
double im;
public:
Complex (double re, double im);

};

Complex::Complex (double re, double im)
{
this->re = re;
this->im = im;
}

std::ostream& operator<< (std::ostream& s, const Complex& z)
{
return s << '(' << z.re << ',' << z.im << ')';
}
Re[3]: Перегрузка <<
От: Bell Россия  
Дата: 20.07.04 06:07
Оценка:
Здравствуйте, javabear, Вы писали:


J>Не, все совсем не так.

Именно так. Проблема была в том, что другом объявлялся оператор с одной сигнатурой, а реализация оператора имела другую сигнатуру.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Перегрузка <<
От: Андрей Тарасевич Беларусь  
Дата: 20.07.04 06:44
Оценка:
Здравствуйте, javabear, Вы писали:

J>Не, все совсем не так

J>там дело в определении оператора << оно каким то образом не совпадает с задекларированным в классе friend?

Ну так вот в этом-то оно и не совпадает — забыли поставить 'const' в определении оператора '<<'. Все правильно.
Best regards,
Андрей Тарасевич
Re[2]: Перегрузка <<
От: O-Sam Россия  
Дата: 26.07.04 12:04
Оценка:
GIV>
GIV> ostream& operator<< (ostream& s, const Complex& z)
GIV>


Однако, странности:

Z:\Heap\Coding\Cpp\iotest\main.cpp(30) : error C2593: 'operator <<' is ambiguous
Error executing cl.exe.



#include <iostream>
using namespace std;

class Complex
{
    double re;
    double im;
public:
    Complex (double re, double im);
    double real() const {return re;}
    double imag() const {return im;}
    friend ostream& operator<< (ostream& s, const Complex& z);
};

Complex::Complex (double re, double im)
{
    this->re = re;
    this->im = im;
}

ostream& operator<< (ostream& s, const Complex& z)
{
    return s << '(' << z.real() << ',' << z.imag() << ')';
}


void main(void)
{
    Complex a(1.2,0.2);
    cout << "a=" << a;
}
Re[3]: Перегрузка <<
От: Bell Россия  
Дата: 26.07.04 12:28
Оценка: +1
Здравствуйте, O-Sam, Вы писали:

Приведенный пример прекрасно компилируется (Comeau, VC6).
Любите книгу — источник знаний (с) М.Горький
Re[4]: Перегрузка <<
От: O-Sam Россия  
Дата: 26.07.04 12:36
Оценка:
B>Приведенный пример прекрасно компилируется (Comeau, VC6).
Comeau — это что? У меня (MSVC 6.0) выдается именно такая ошибка.
Re[5]: Перегрузка <<
От: Bell Россия  
Дата: 26.07.04 12:39
Оценка:
Здравствуйте, O-Sam, Вы писали:

B>>Приведенный пример прекрасно компилируется (Comeau, VC6).

OS>Comeau — это что?
компилятор такой: http://www.comeaucomputing.com

OS>У меня (MSVC 6.0) выдается именно такая ошибка.

У меня тоже MSVC 6.0, и он компилит твой пример без проблем. Скорее всего, в твоем коде есть что-то, чего ты не привел здесь.
Любите книгу — источник знаний (с) М.Горький
Re[5]: Перегрузка <<
От: vaxyzek  
Дата: 27.07.04 03:35
Оценка:
Здравствуйте, O-Sam, Вы писали:

B>>Приведенный пример прекрасно компилируется (Comeau, VC6).

OS>Comeau — это что? У меня (MSVC 6.0) выдается именно такая ошибка.

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
(MSVC 6.0)

Все нормально никаких ошибок.!
Из каждой функции бывают свои исключения....
Re[3]: Перегрузка <<
От: O-Sam Россия  
Дата: 10.08.04 15:57
Оценка:
Проблема решилась установкой MSVC 6.0 SE Service Pack 5.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.