std :: unique指针和自定义lambda删除器错误

时间:2013-07-29 18:13:05

标签: c++ visual-studio-2012 lambda smart-pointers unique-ptr

我正在尝试使用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删除器的错误方法吗?

2 个答案:

答案 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文件中的任何函数外部初始化。

提示:如果事情神秘地无法正常工作,请坚持初始化为空指针并稍后分配真值。