C++:error C2280: attempting to reference a deleted function

如下代码会报错:error C2280: attempting to reference a deleted function

#include <list>
#include <vector>
#include <memory>
#include <mutex>
#include <string>

class ActionQueue {

private:

  std::list<std::shared_ptr<std::string>> ctxQueue;

  std::mutex m;

public:

  bool is_empty();

  void emplace_front(string* ctx_ptr);

  std::string& pop_back();
};


int main() {

  std::vector<ActionQueue> ctxQueueArray;

  return 0;
}

原因如下:

由于std::mutex的拷贝构造函数被禁了:

mutex( const mutex& ) = delete;

导致编译器不会为ActionQueue生成默认的拷贝构造函数,即:

ActionQueue(const ActionQueue& actionQueue) = delete;

而std::vector<ActionQueue>是要求ActionQueue必须包含拷贝构造函数的,所以就报错了。

修改方法也很简单,把  std::mutex m;改成  std::shared_ptr<std::mutex> mPtr;就可以了:

#include <list>
#include <vector>
#include <memory>
#include <mutex>
#include <string>

class ActionQueue {

private:

  std::list<std::shared_ptr<std::string>> ctxQueue;

  std::shared_ptr<std::mutex> mPtr;

public:

  ActionQueue() : mPtr(new std::mutex()) {}

  bool is_empty();

  void emplace_front(string* ctx_ptr);

  std::string& pop_back();
};

由于std::shared_ptr的拷贝构造函数没有被禁用,所以编译器会默认生成ActionQueue(const ActionQueue& actionQueue),这样编译就通过了。


参考文档
https://en.cppreference.com/w/cpp/thread/mutex/mutex
https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值