在看effective c++时遇到智能指针shared_ptr,在一个类中使用时出现问题,具体的代码见下:
结果如图所示,在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