首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造函数中的成员函数指针

构造函数中的成员函数指针
EN

Stack Overflow用户
提问于 2016-03-04 15:21:12
回答 4查看 528关注 0票数 7

我尝试在删除器中使用std::shared_pointer。我尝试使用一个成员函数作为删除器。然而,它无法编译。编译器给了我一条错误消息,但我不明白为什么它不能工作。有人知道它为什么不起作用吗?非常感谢。

简化代码如下,

代码语言:javascript
运行
复制
#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;
    }
};

编译器发出的错误消息如下,

代码语言:javascript
运行
复制
error: invalid use of non-static member function
std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter);
                                                                 ^

非常感谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-04 15:24:55

如果要使用非静态成员函数作为删除器,则必须将其绑定到实例--但请注意,当调用删除器时,实例仍需处于活动状态。例如,

代码语言:javascript
运行
复制
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;
    }
};

如果不需要特定实例,则可以使函数保持静态,因此它不需要实例。

代码语言:javascript
运行
复制
class ShorterName {
public:
    ShorterName(void) {
        auto a = std::shared_ptr<int>(new int(1), deleter);
    }

    static void deleter(int* value) {
        delete value;
    }
};
票数 3
EN

Stack Overflow用户

发布于 2016-03-04 15:22:33

要使用不绑定到类实例的成员函数,必须声明方法static

代码语言:javascript
运行
复制
static void deleter(int* value) {
    delete value;
}
票数 8
EN

Stack Overflow用户

发布于 2016-03-04 15:25:22

有几种方法可以解决这个问题。如果您实际上是指一个非静态成员函数,那么其中一种方法(并不是唯一的方法)是通过lambda函数实现的。

代码语言:javascript
运行
复制
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;
    }   
};  
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35799621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档