用于shared_ptr <>的自定义删除器,给出“无上下文错误”

Anu*_*hke 0 c++ c++11

#include <memory>
#include <iostream>
using namespace std;
class A
{
    public:
    int val;
    void deleter(A *x)
    {
        cout << "In Delete" << endl;
    }

    void push_back(int val)
    {
        shared_ptr<A> temp = (new int(val),deleter);
        cout << temp.use_count() << endl;
    }

};


int main()
{
    A a;
    a.push_back(11);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下错误。

test.cpp: In member function 'void A::push_back(int)':
test.cpp:17:44: error: no context to resolve type of '((A*)this)->A::deleter'
         shared_ptr<A> temp = (new int(val),deleter);
Run Code Online (Sandbox Code Playgroud)

总的来说,我正在尝试为shared_ptr实现一个自定义删除器,这是嵌套类的成员函数,并且遇到了可怕的C ++错误。所有的google例子都是deleter是全局函数的例子。

我在这里想念什么?

建议1:基于第一个建议,我改为以下内容。

class A;
    void deleter(A *a)
    {
        cout << "In destrcu" << endl;
    }
class A
{
    public:
    int val;

    void push_back(int val)
    {
        shared_ptr<A> temp = (new int(val),deleter);
        cout << temp.use_count() << endl;
    }

};
Run Code Online (Sandbox Code Playgroud)

我仍然会收到此错误,

test.cpp: In member function 'void A::push_back(int)':
test.cpp:16:43: error: conversion from 'void(A*)' to non-scalar type 'std::shared_ptr<A>' requested
         shared_ptr<A> temp = (new int(val),deleter);
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

首先,您在中遇到一些错别字/语法错误

void push_back(int val)
{
    shared_ptr<A> temp = (new int(val),deleter);
    cout << temp.use_count() << endl;
}
Run Code Online (Sandbox Code Playgroud)

线

shared_ptr<A> temp = (new int(val),deleter);
Run Code Online (Sandbox Code Playgroud)

应该

shared_ptr<A> temp = shared_ptr<A>(new int(val),deleter);
//or
shared_ptr<A> temp(new int(val),deleter);
Run Code Online (Sandbox Code Playgroud)

然后

new int(val)
Run Code Online (Sandbox Code Playgroud)

是不正确的,因为您正在创建a int*并尝试初始化具有的指针temp,但是由于temp包含a A*而不是a 而不能这样做int*。如果你想设置的值val成员,那么你需要一个构造函数A服用int。有

A(int val) : val(val) {}
Run Code Online (Sandbox Code Playgroud)

让你写

shared_ptr<A> temp(new A(val),deleter);
Run Code Online (Sandbox Code Playgroud)

但是仍然存在问题deleterdeleter是一个非静态成员函数,这意味着没有类的实例就无法调用它。那意味着你要么需要做deleter static,在这种情况下很好,因为你不需要里面的A对象deleter。如果您需要具有非静态成员函数,则可以使用Lambda将对象与绑定在一起deleter。看起来像

shared_ptr<A> temp(new A(val),[this](auto ptr){ deleter(ptr) }); // capture the current object
//or
A delete_obj(some_value);
shared_ptr<A> temp(new A(val),[=](auto ptr){ delete_obj.deleter(ptr) }); // captures a object for itself
Run Code Online (Sandbox Code Playgroud)