我尝试在删除器中使用std::shared_pointer。我尝试使用一个成员函数作为删除器。然而,它无法编译。编译器给了我一条错误消息,但我不明白为什么它不能工作。有人知道它为什么不起作用吗?非常感谢。
简化代码如下,
#include <memory>
class MemberFunctionPointerInConstructor {
public:
MemberFunctionPointerInConstructor(void) {
std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter); // this line makes a compiler error message
}
void deleter(int* value) {
delete value;
}
};编译器发出的错误消息如下,
error: invalid use of non-static member function
std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter);
^非常感谢。
发布于 2016-03-04 15:24:55
如果要使用非静态成员函数作为删除器,则必须将其绑定到实例--但请注意,当调用删除器时,实例仍需处于活动状态。例如,
class ShorterName {
public:
ShorterName(void) {
using namespace std::placeholders;
auto a = std::shared_ptr<int>(new int(1),
std::bind(&A::deleter, this, _1));
}
void deleter(int* value) {
delete value;
}
};如果不需要特定实例,则可以使函数保持静态,因此它不需要实例。
class ShorterName {
public:
ShorterName(void) {
auto a = std::shared_ptr<int>(new int(1), deleter);
}
static void deleter(int* value) {
delete value;
}
};发布于 2016-03-04 15:22:33
要使用不绑定到类实例的成员函数,必须声明方法static
static void deleter(int* value) {
delete value;
}发布于 2016-03-04 15:25:22
有几种方法可以解决这个问题。如果您实际上是指一个非静态成员函数,那么其中一种方法(并不是唯一的方法)是通过lambda函数实现的。
class MemberFunctionPointerInConstructor {
public:
MemberFunctionPointerInConstructor() {
std::shared_ptr<int> a = std::shared_ptr<int>(
new int(1),
[this](int *p){this->deleter(p);});
}
void deleter(int* value) {
delete value;
}
}; https://stackoverflow.com/questions/35799621
复制相似问题