В некоторых более старых версиях visual-studio требовалось полное определение типа, чтобы 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)
Однако, когда я пытаюсь сделать это в visual-studio-2012 , я получаю:
предупреждение C4150: удаление указателя на неполный тип Foo;
деструктор не называется
Можно ли как-то обойти это?
Живой пример