У вас есть две проблемы:
Во-первых, аргумент шаблона - это класс , на который указывает указатель. Так что если вы хотите указатель на Foo
, то шаблон должен быть Foo
. В вашем случае вы говорите, что f
- это указатель на указатель на FILE
. Поэтому первое, что вам нужно сделать, это сделать f
указателем на FILE
, указав тип FILE
при определении f
.
Вторая проблема заключается в том, что переменная f
- это не функция, которую вы можете вызвать, это объект. Вам необходимо использовать объекты reset
:
f.reset(ff);
Теперь, что касается первой проблемы, ее решение приводит к другой проблеме. Проблема возникает из-за того, что средство удаления по умолчанию для shared_ptr
делает то, на что это похоже: оно пытается delete
содержащийся указатель. Это невозможно по нескольким причинам (например, FILE
является непрозрачным типом данных и указатель не был создан с new
).
Это решается простым использованием функции fclose
в качестве средства удаления и передачей ее вместе с вызовом reset
:
f.reset(ff, fclose);