Deleter unique_ptr для ostream
От: _agg  
Дата: 19.04.23 03:04
Оценка:
Всем привет, как обычно писал код на одной из библиотек и там было макроопределение:
#define OSTREAM std::ostream


В примерах было показано использование типа такого:
...
OSTREAM *ost = new std::ofstream("file.txt", std::ios::app);
...
delete ost;
...


Все как бы работает, я решил переделать это под 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, но все же хочу понять как сие блюдо приготовить?
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.