Как написать пользовательский модуль удаления для обработки объявленных типов вперед - PullRequest
0 голосов
/ 19 сентября 2019

В некоторых более старых версиях требовалось полное определение типа, чтобы default_deleter был определен . ( Я знаю, что это имело место в Visual Studio2012 , но я бы дал бонусные баллы любому, кто мог бы сказать мне, какая версия исправила это.)

Чтобы обойти это, я могу написать custom_deleter функцию, например:

template <typename T>
void custom_deleter(T* param) {
    delete param;
}

И объявить умный указатель на объявленный тип вперед следующим образом: unique_ptr<Foo, function<void(Foo*)>> pFoo, назначив этот указатель, где Foo был полностью объявлен так: pFoo = decltype(pFoo)(new Foo, function(custom_deleter<Foo>))

Теперь, как предложено здесь , я хотел бы превратить мой custom_deleter в функтор, подобный этому:

struct MyDeleter {
    template <typename T>
    void operator ()(T* param) {
        delete param;
    }
};

Который должен позволить мне объявить: unique_ptr<Foo, MyDeleter> и назначить: pFoo = decltype(pFoo)(new Foo)Однако, когда я пытаюсь сделать это в , я получаю:

предупреждение C4150: удаление указателя на неполный тип Foo; деструктор не называется

Можно ли как-то обойти это?

Живой пример

...