powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не пйму.
7 сообщений из 7, страница 1 из 1
Не пйму.
    #32594445
Dima_Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему этот код выдаут ошибку :error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class OBJ' (or there is no acceptable conversion).
Компилятор VC 6

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;
class OBJ
{
public:
int id_obj;
int x;
int y;
ostream& operator << (ostream& s);

};
ostream& OBJ::operator <<(ostream& s)
{
return s<<id_obj<<x<<y;
}
int main(int argc, char* argv[])
{
OBJ d;
d.id_obj=1;
d.x=1;
d.y=1;
ofstream file("c:\\dima.dat");
cout<<d;
file.close();
return 0;
}
...
Рейтинг: 0 / 0
Не пйму.
    #32594764
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну сделай так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class OBJ
{
public:
int id_obj;
int x;
int y;
friend ostream& operator << (ostream& s, OBJ);

};
ostream& operator <<(ostream& s, OBJ ob)
{
return s<<ob.id_obj<<ob.x<<ob.y;
}
...
Рейтинг: 0 / 0
Не пйму.
    #32594960
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это известная проблема VC6. Лечится отказом от using namespace std и явной квалификацией:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>

class foo
{
    ...
public:
    friend std::ostream& operator<<(std::ostream& stream, const foo &)
    {
         ...
         return stream;
    } 
};
...

std::cout << foo();
...
Рейтинг: 0 / 0
Не пйму.
    #32595689
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а friend там зачем?
Это же метод класса...
Или я чё-то не так понял?
...
Рейтинг: 0 / 0
Не пйму.
    #32595754
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А слона-то я и не приметил:) В оригинальном коде автора ошибка бы не убралась и после предложенных манипуляций, посколько operator >> как член класса можно было бы использовать только так:

OBJ obj;
obj << std::cout;

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

Теперь на счет friend-а. В моем коде он обязателен, поскольку мы формируем внешний по отношению к foo бинарный оператор. Если бы это был член класса foo, то с приведенной сигнатурой мы бы получили тернарный оператор, за что получили бы от компилятора.
...
Рейтинг: 0 / 0
Не пйму.
    #32596487
Dima_Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, разобрался.
...
Рейтинг: 0 / 0
Не пйму.
    #32596589
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, понял, каюсь :)
Маня смутило то, что он описан внутри класса
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не пйму.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]