1. ホーム
  2. C++

C++: エラー C2280: 削除された関数を参照しようとしています。

2022-02-10 09:51:20

次のコードはエラーを報告します: error C2280: attempting to reference 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 ActionQue& actionQueue) を生成し、コンパイルはパスします。


参考資料
https://en.cppreference.com/w/cpp/thread/mutex/mutex
https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr