我有一个名叫
这是我实例化
这给我返回了以下错误信息:
尝试引用已删除的函数。
显然,我正在尝试引用被定义为“已删除”的复制构造函数(这是有原因的,此类对象不应被复制)。但我困惑的是,既然我正在传递共享指针,为什么会调用复制构造函数,以及如何避免这种情况。
classA
的类,大概长这样:class classA {
private:
char* data;
public:
classA(const classA&) = delete;
~classA();
};
~classA()
{
delete[] data;
}
在另一个类中,我们称之为classB
,我作为成员拥有对classA
的共享指针:
class classB
{
private:
std::shared_ptr<classA> ptrA;
public:
classB(std::shared_ptr<classA>);
};
classB(std::shared_ptr<classA> sp) : ptrA(sp)
{}
这是我实例化
classB
的方法:classA ca;
classB cb(std::make_shared<classA>(ca));
这给我返回了以下错误信息:
尝试引用已删除的函数。
显然,我正在尝试引用被定义为“已删除”的复制构造函数(这是有原因的,此类对象不应被复制)。但我困惑的是,既然我正在传递共享指针,为什么会调用复制构造函数,以及如何避免这种情况。
std::make_shared<classA>(std::move(ca))
,仍然会出现问题,请参见Default move constructor/assignment and deleted copy constructor/assignment。 - Justinmake_shared
正试图从另一个classA
(ca
) 构造一个classA
。你想做什么?你希望shared_ptr
接管ca
的所有权吗? - TasclassA ca();
确实是前向声明了一个名为ca
的函数,该函数返回一个classA
,但我认为我们都知道 OP 实际上想表达的意思。当然,他们没有发布实际的代码,但仍然足够清楚。 - Justin