2013-07-29 17 views
3

我試圖用std :: unique_pointer與它提供一個自定義的λ刪除器,但我正在逐漸語法錯誤:的std ::唯一指針和定製拉姆達刪除器錯誤

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 deleter?

+0

就這樣我們很清楚,這實際上是'std :: default_deleter '所做的,所以即使它工作,你也沒有做任何有意義的事情。 – Rapptz

回答

5

刪除者必須是unique_ptr的類型的一部分。

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

在進行此更改後,您的代碼應該可以正常工作。另外,我假設你要做的只是在刪除器內的指針上調用delete。如果沒有,則不需要提供定製刪除器。

+0

[也可以這樣做](http://coliru.stacked-crooked.com/view?id=5c1496ef39030f333dd4a8e6d5161aae-ad01b9d4245b5d59a84467091ae99245)。不過每個lambda都有自己的類型,即使它們完全一樣。 – Rapptz

+0

謝謝,這是有效的。是的,我只是提供一個最小的例子來重現問題 – KaiserJohaan

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文件中的任何函數之外初始化。提示:堅持初始化爲空指針,以後如果事情神祕地失效,則分配真值。