2012-12-24 52 views
1

我最近經歷了用C++ 11智能指針取代所有原始指針的過程,現在我終於完成了DirectX長指針的例外。針對directx的C++智能指針

我想相處的實施以下線的東西:

std::shared_ptr<IDirect3D9> p_d3d; 
p_d3d(Direct3DCreate9(D3D_SDK_VERSION), [](IDirect3D9 *p) {//smart pointer initialization(1) 
     p->Release(); 
}); 

我越來越從Visual Studio以下錯誤:

錯誤:的對象的通話沒有合適的類型 運算符()或轉換函數指針函數類型

我寧願使用std :: un ique_ptr或std :: shared_ptr比CComPtr。 關於爲什麼會發生這種情況以及可能的實施方法的任何想法?

+0

初始化是在聲明變量時完成的。 – chris

+1

C++智能指針不支持COM對象依賴的ref-counting語義。建議您使用COM智能指針。具有兩個競爭參考計數方案的 – IInspectable

+1

不是一個好主意。特別是對於你想要的方案,當你有一組指向它的智能指針時,被引用的對象可以被銷燬。而是建立自己的COM智能指針。如果您使用Boost庫,則可以使用boost :: intrusive_ptr來保存一些工作(如果我正確地記住它的名稱)。不幸的是,構建塊沒有被採用到C++ 11標準中。 –

回答

2

您似乎在您的shared_ptr上調用operator()。這不是你構建shared_ptr的方式。嘗試使用reset,或者在聲明變量的同一行上構造指針。

請注意,您調用的創建函數會爲您提供一個引用計數爲1的指針。