Перегруженная функция чистильщика

539
16 мая 2018, 20:00

Как исправить данную ошибку.

#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;
}
Answer 1

Сделать 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);}};

Answer 2

Если для удаления объектов класса должна использоваться специальная функция зачистки, то имеет смысл реализовать специализацию 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

READ ALSO
C++ массивы байт переменной (неизвестной) длины для представления данных и SHA256

C++ массивы байт переменной (неизвестной) длины для представления данных и SHA256

Хочу переписать этот код с Go на C++/Boost ради опыта работы с библиотеками типа asio

222
Цикличный сдвиг элементов списка [требует правки]

Цикличный сдвиг элементов списка [требует правки]

Как реализовать цикличный сдвиг элементов списка?

210
Расшифровка CryptoStream в с++

Расшифровка CryptoStream в с++

Есть файл зашифрованный с помощью класса CryptoStream (NET Framework)

231
Наследование шаблона с++ [дубликат]

Наследование шаблона с++ [дубликат]

На данный вопрос уже ответили:

185