【问题标题】:Error "Attempting to reference a deleted function" - when passing back value of unique_ptr错误“尝试引用已删除的函数” - 传回 unique_ptr 的值时
【发布时间】:2015-07-23 23:30:10
【问题描述】:

测试.h

#include <memory>
#include <string>
using namespace std;

class A
{
public:
    A GetTitle();
private:
    unique_ptr<A> title;
};

Test.cpp

#include <memory>
#include "Test.h"

A A::GetTitle()
{
    return *this->title.get();
} // Error here

int main()
{
}

我收到以下错误:

C2280: 'std::unique_ptr>::unique_ptr(const std::unique_ptr<_ty>> &)' :试图 引用已删除的函数

我在这里做错了什么?是否归结为this-&gt;keyServer 的所有权?我如何只将值传回,以便我根本不允许函数的用户在不使用 setter 的情况下修改类内的值?

【问题讨论】:

  • 用错误注释更新了 OP。我还没打电话呢。
  • 投反对票的任何理由?我什至创建了一个全新的项目来隔离错误......并提供了所有代码。
  • 你为什么选择unique_ptr这里?它真的是一次只能存在一个副本的资源吗?
  • 好吧,我以为我只希望我的 A 类拥有这个标题,比如说(我知道它是由代码组成的)......我只是想让人们访问它但不能操作它...所以是的,我认为 unique_ptr 在这里很完美。
  • 哦,我认为这是其他地方的问题!

标签: c++ c++11 unique-ptr


【解决方案1】:

A 不可复制,因为存在 unique_ptr 数据成员。 GetTitle() 成员函数试图复制A,因为它按值返回A,导致(误导性)错误。

如果您希望能够复制A,您需要提供一个复制构造函数定义。


总的来说,你的例子很奇怪。如果A 是唯一资源,您是否应该在该成员函数中复制它?如果A::title 实际上包含一个指向从A 派生的类的指针呢?那么复制操作将无法按预期工作。

【讨论】:

  • 您还复制了unique_ptr。您也可以在此时将其设为shared_ptr,如果一次存在多个具有给定指针的A,这将更有意义。
  • 太好了,让我试试看!
  • @Donnie unique_ptr 在哪里被复制?错误消息表明编译器为A 生成的复制构造函数定义将复制unique_ptr,因此它的格式不正确。
  • 我已经稍微改变了我的 OP,也许这更有意义?
  • @Jimmyt1988 这没有什么意义。现在我们需要B的定义。
猜你喜欢
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2022-01-07
相关资源
最近更新 更多