3

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

4

2 回答 2

5

删除器必须是unique_ptr's 类型的一部分。

typedef std::unique_ptr<TestClass, void(*)(TestClass *)> TestClassPtr;

进行此更改后,您的代码应该可以工作。另外,我假设您要做的不是简单地调用delete删除器中的指针。如果没有,则无需提供自定义删除器。

于 2013-07-29T18:18:22.993 回答
0

无需使用类型定义或将 lambda 保存在自动变量中。在下面的代码中,忽略 Type 的突出显示。此代码是由我的一个工作应用程序中的代码制成的伪代码。

在 hpp 类声明中:

类内初始化是丑陋但强制性的。没有在赋值右侧尝试过 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 文件中的任何函数之外进行初始化。

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

于 2015-02-11T01:59:30.470 回答