#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)
首先,您在中遇到一些错别字/语法错误
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)
但是仍然存在问题deleter。 deleter是一个非静态成员函数,这意味着没有类的实例就无法调用它。那意味着你要么需要做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)
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |