Все как бы работает, я решил переделать это под std::unique_ptr, если использовать вот таким образом то все работает:
std::unique_ptr < OSTREAM > pstm (new std::ofstream("file.txt", std::ios::app));
но нужно было отложить инициализацию и сделать что то вроде вот этого:
std::unique_ptr < OSTREAM > pstm;
pstm = new std::ofstream("file.txt", std::ios::app);
Получил вот такие ошибки:
error C2679: binary '=': no operator found which takes a right-hand operand of type 'std::ofstream *' (or there is no acceptable conversion)
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\memory(2338): note: could be 'std::unique_ptr<std::ostream,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)'
1> with
1> [
1> _Ty=std::ostream
1> ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\memory(2276): note: or 'std::unique_ptr<std::ostream,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(std::unique_ptr<_Ty,std::default_delete<_Ty>> &&) noexcept'
1> with
1> [
1> _Ty=std::ostream
1> ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\memory(2202): note: or 'std::unique_ptr<std::ostream,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(std::nullptr_t) noexcept'
1> with
1> [
1> _Ty=std::ostream
1> ]
1>d:\projects\custom_deleter\custom_deleter.cpp(19): note: while trying to match the argument list '(std::unique_ptr<std::ostream,std::default_delete<_Ty>>, std::ofstream *)'
1> with
1> [
1> _Ty=std::ostream
1> ]
Пробовал добавлять кастомный делетер, но ничего с этого не вышло и эта тема осталась для меня не раскрыта, я конечно сделал по старинке с вызовом delete, но все же хочу понять как сие блюдо приготовить?
Спасибо.
Оператор присваивания тоже можно использовать (как альтернативу reset, про который сказали выше), но для этого в правой части оператора присваивания нужно скорструировать unique_ptr:
P.S. Ну и мелкое замечание: если уже заведен макрос OSTREAM, то его следует либо использовать регулярно, либо не использовать вообще. А если будет в одном месте OSTREAM, а в другом std::ofstream, то можно получить нежданчик, если вдруг в один прекрасный день кто-то подредактирует это макроопределение.
--
Не можешь достичь желаемого — пожелай достигнутого.
R>P.S. Ну и мелкое замечание: если уже заведен макрос OSTREAM, то его следует либо использовать регулярно, либо не использовать вообще. А если будет в одном месте OSTREAM, а в другом std::ofstream, то можно получить нежданчик, если вдруг в один прекрасный день кто-то подредактирует это макроопределение.
А еще лучше вместо макроса сделать
using OSTREAM = std::ofstream;
Макросы -- зло. Иногда необходимое, но если можно обойтись инлайн-функцией, typedef или constexpr -- лучше обойтись
R>Оператор присваивания тоже можно использовать (как альтернативу reset, про который сказали выше), но для этого в правой части оператора присваивания нужно скорструировать unique_ptr:
R>
R>P.S. Ну и мелкое замечание: если уже заведен макрос OSTREAM, то его следует либо использовать регулярно, либо не использовать вообще. А если будет в одном месте OSTREAM, а в другом std::ofstream, то можно получить нежданчик, если вдруг в один прекрасный день кто-то подредактирует это макроопределение.
Внимательнее читайте, этот макрос объявлен в библиотеке, и эта библиотека использует этот поток, а пользователь библиотеки уже сам назначает куда же этот std::ostream будет писать, поэтому и было написано таким образом:
//объявление OSTREAM это std::ostream
std::unique_ptr<OSTREAM> ostm;
...
//инициализация
ostm.reset(new std::ofstream("file.txt", std::ios::app)) // это рабочий вариант
//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файловым потоком std::ofstream
pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app)
Здравствуйте, _agg, Вы писали:
_>Внимательнее читайте, этот макрос объявлен в библиотеке, и эта библиотека использует этот поток, а пользователь библиотеки уже сам назначает куда же этот std::ostream будет писать, поэтому и было написано таким образом:
_>//объявление OSTREAM это std::ostream
_>std::unique_ptr<OSTREAM> ostm;
_>...
_>//инициализация
_>ostm.reset(new std::ofstream("file.txt", std::ios::app)) // это рабочий вариант
Да, виноват, невнимательно посмотрел.
_>//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файловым потоком std::ofstream
_>pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app)
Вариант с присваиванием тоже вполне рабочий, нужно просто использовать std::ofstream вместо OSTREAM:
_>//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файловым потоком std::ofstream
_>pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app)
_>
Надо так:
//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файловым потоком std::ofstream
pstm = std::make_unique<std::ofstream>("file.txt", std::ios::app)
Здравствуйте, qaz77, Вы писали:
Q>Здравствуйте, _agg, Вы писали: _>>
_>>//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файловым потоком std::ofstream
_>>pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app)
_>>
Q>Надо так: Q>
Q>//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файловым потоком std::ofstream
Q>pstm = std::make_unique<std::ofstream>("file.txt", std::ios::app)
Q>
Заметил уже который раз когда погружаюсь в новую библиотеку начинаю что-нибудь забывать что знал ).
Ну а в целом огромное вам всем спасибо коллеги, всем добра !
Здравствуйте, _agg, Вы писали:
_> Заметил уже который раз когда погружаюсь в новую библиотеку начинаю что-нибудь забывать что знал ).
В этом нет ничего удивительного — помимо замечательной способности запоминать у человеческого мозга есть не менее замечательная способность — забывать. Без этой способности мы все с ума посходили бы.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>В этом нет ничего удивительного — помимо замечательной способности запоминать у человеческого мозга есть не менее замечательная способность — забывать. Без этой способности мы все с ума посходили бы.
Кроме бинарного режима (забывать или не забывать), можно было бы и гибкость проявить. А ещё лучше — отдать это на управление человеку — позволить самому решать, что забывать, а что нет.