在看effective c++時遇到智能指針shared_ptr,在一個類中使用時出現問題,具體的代碼見下:
屏幕快照 2016-11-23 13.11.28.png
結果如圖所示,在lock類中聲明了一個shared_ptr<int> m_p;但是在lock的構造函數中卻初始化不了shared_ptr<int> m_p。
首先,需要明確一點,那就是智能指針帶處理函數的初始化方法,如:
int m = 5;
void func(int &m){//......}
shared_ptr<int> m_p(&m,func);
以上是初始化一個智能指針m_p,其帶有一個后續處理的函數func,這個函數的實參是&m。
簡單地了解這個之后,我們回歸正題,根據這個智能指針的初始化方法,可以確定在lock類中進行如此初始化是可以的,那為什么還報錯?
是因為此時智能指針m_p的處理函數是一個類中的成員函數unlock,且傳給智能指針的也是一個函數指針,但是要調用成員函數的話,是需要通過類的實例對象來進行的,而在智能指針中調用的時候,是沒有這個實例對象存在的,結果就掛了。
參考:http://stackoverflow.com/questions/22513680/non-static-member-function-must-be-called