Как исправить данную ошибку.
#include <iostream>
#include <memory>
struct A {};
struct B {};
void F(A*) {}
void F(B*) {}
int main()
{
/* E0299 не удается определить экземпляр перегруженная функция "F",
использование которого предполагается */
std::shared_ptr<A> p{new A, F};
return 0;
}
Сделать 2 вещи:
Первое - объявить void F(A*) {}
, ибо делетер работает с указателем.
Второе...
Либо убрать перегрузку для B
.
Либо разрешить неопределенность самостоятельно - std::shared_ptr<A> p(new A, (void (*)(A*))F);
Либо дописать переходник: std::shared_ptr<A> p{new A, [](A* p){F(p);}};
Если для удаления объектов класса должна использоваться специальная функция зачистки, то имеет смысл реализовать специализацию std::default_delete
и не передавать дополнительных параметров в умные указатели. Этот вариант подходит, если тип удаляемого объекта полон (complete):
#include <iostream>
#include <memory>
struct A {};
struct B {};
void F(A*) {}
void F(B*) {}
namespace std
{
template<>
struct default_delete<::A>
{
public: void
operator ()(::A * p) const
{
cout << "spec deleter";
::F(p);
}
};
} // namespace std
int main()
{
std::shared_ptr<A> p{new A};
return 0;
}
online compiler
Хочу переписать этот код с Go на C++/Boost ради опыта работы с библиотеками типа asio
Как реализовать цикличный сдвиг элементов списка?
Есть файл зашифрованный с помощью класса CryptoStream (NET Framework)