我正在尝试使用std :: unique_pointer并使用它提供自定义lambda删除器,但我收到语法错误:
cannot convert from 'wmain::<lambda_0f8f736f48c52ca6fa24492e7c0c1ec0>' to 'const std::default_delete<_Ty>'
使用以下简单的最小代码:
#include <memory>
class TestClass
{
};
typedef std::unique_ptr<TestClass> TestClassPtr;
int _tmain(int argc, _TCHAR* argv[])
{
TestClassPtr testPtr(new TestClass(), [](TestClass* w){ delete w;});
return 0;
}
这是向智能指针提供lambda删除器的错误方法吗?
答案 0 :(得分:5)
删除者必须是unique_ptr
类型的一部分。
typedef std::unique_ptr<TestClass, void(*)(TestClass *)> TestClassPtr;
进行此更改后,您的代码应该可以正常运行。另外,我假设你要做的事情不仅仅是在删除器中的指针上调用delete
。如果没有,则无需提供自定义删除器。
答案 1 :(得分:0)
无需使用类型定义或将lambda保存在自动变量中。在下面的代码中,忽略Type的突出显示。这段代码是由我的一个工作应用程序中的代码构成的伪代码。
在hpp类声明中:
类初始化是丑陋的但是必须的。 Haven在分配的右边尝试了C ++ 14 std :: make_unique()。 C ++ 11就是我写这篇文章时的全部内容。
std::unique_ptr<Type, rtype (*)(Type*)> member = std::unique_ptr<Type, rtype (*)(Type*)>(nullptr, nullptr);
在.cpp类定义中:
member = std::unique_ptr<Type, rtype (*)(Type*)>(new Type(), [](Type* ptr2_Type) {
delete ptr2_Type;
return rtype;
});
对于静态成员,请遵循静态成员的规则:不在类初始化中。使用完全限定名称在cpp文件中的任何函数外部初始化。
提示:如果事情神秘地无法正常工作,请坚持初始化为空指针并稍后分配真值。