Проблема с потоками ввода-вывода
От: Аноним  
Дата: 25.09.07 05:10
Оценка:
Здравствуйте, уважаемые!
Возникла такая проблема. Почему-то при использовании экземпляра класса файлового потока ofstream в качестве свойства своего класса, проект не компелируется.
Пример кода:


#include <Windows.h>
#include <iostream>
#include <fstream>

using namespace std;

class Log
{
private:
ofstream out;
public:

Log(): out("log.txt")
{}

Log operator<<(int m)
{
out << m;
return *this;
}
};

int main()
{
Log l;
return 0;
}


Пользуюсь средой MSVS 2005.
Выдает следующую ошибку:
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'

Ошибка в том месте, где объявлены как закрытые конструктор копий и оператор присваивания класса basic_ios.
Их реализация по понятным причинам отсутствует.

Причем, что странно, на шестой студии (MSVS 6.0) данный код без проблем компилируется.

Что еще более странно, при небольшом видоизменении класса Log, компилятор MSVS 2005 перестает ругаться:


class Log
{
private:
ofstream *pout;
public:

Log(): pout(NULL)
{
pout = new ofstream("log.txt");
}
~Log()
{
delete pout;
}

Log operator<<(int m)
{
*pout << m;
return *this;
}

};


Может кто встречался с такими проблемами?
Re: Проблема с потоками ввода-вывода
От: LaptevVV Россия  
Дата: 25.09.07 05:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, уважаемые!

А>Возникла такая проблема. Почему-то при использовании экземпляра класса файлового потока ofstream в качестве свойства своего класса, проект не компbлируется.
А>Пример кода:

А>
А>#include <Windows.h>
А>#include <iostream>
А>#include <fstream>
А>using namespace std;
А>class Log
А>{
А>private:
А>ofstream out;
А>public:
А>Log(): out("log.txt")
А>{}
А>Log operator<<(int m)
А>{
А>out << m;
А>return *this;
А>}
А>};
А>

А>Пользуюсь средой MSVS 2005.
А>Выдает следующую ошибку:
А>error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
А>Ошибка в том месте, где объявлены как закрытые конструктор копий и оператор присваивания класса basic_ios.
А>Их реализация по понятным причинам отсутствует.
А>Причем, что странно, на шестой студии (MSVS 6.0) данный код без проблем компилируется.
А>Что еще более странно, при небольшом видоизменении класса Log, компилятор MSVS 2005 перестает ругаться:
А>
А>class Log
А>{
А>private:
А>ofstream *pout;
А>public:
А>Log(): pout(NULL)
А>{
А>pout = new ofstream("log.txt");
А>}
А>~Log()
А>{
А>delete pout;
А>}
А>Log operator<<(int m)
А>{
А>*pout << m;
А>return *this;
А>}
А>};
А>

Я думаю, причина в том, что объекты-потоки нельзя присваивать... В первом случае у тебя объект-поток, а во втором — указатель на него... Поэтому против указателя система ничего не имеет...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Проблема с потоками ввода-вывода
От: _silart_  
Дата: 25.09.07 05:44
Оценка:
LVV>Я думаю, причина в том, что объекты-потоки нельзя присваивать... В первом случае у тебя объект-поток, а во втором — указатель на него... Поэтому против указателя система ничего не имеет...

Спасибо БОЛЬШОЕ!
Я объявил конструктор копий и оператор присваивания закрытыми и все стало работать! ))))))))

Странно, в шестой студии потоки присваивать было можно что ли?
Re: Проблема с потоками ввода-вывода
От: s_viy  
Дата: 25.09.07 07:01
Оценка:
Log& operator<<(int m)
Re[3]: Проблема с потоками ввода-вывода
От: LaptevVV Россия  
Дата: 25.09.07 11:35
Оценка:
Здравствуйте, _silart_, Вы писали:

LVV>>Я думаю, причина в том, что объекты-потоки нельзя присваивать... В первом случае у тебя объект-поток, а во втором — указатель на него... Поэтому против указателя система ничего не имеет...


__>Спасибо БОЛЬШОЕ!

__>Я объявил конструктор копий и оператор присваивания закрытыми и все стало работать! ))))))))

__>Странно, в шестой студии потоки присваивать было можно что ли?

Система старая, полно ошибок и не соответствует стандарту как раз в части ввода-выфвода
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Проблема с потоками ввода-вывода
От: Павел Кузнецов  
Дата: 26.09.07 02:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>Log operator<<(int m)
А>{
А>out << m;
А>return *this;
А>}
А>};
А>


А>Пользуюсь средой MSVS 2005.

А>Выдает следующую ошибку:
А>error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'

Поменять на:
Log& operator<<(int m)
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.