簡體   English   中英

使用已刪除的 function 'std::pair <const std::pair<std::basic_string<char> , std::basic_string<char> ></char></const>

[英]use of deleted function 'std::pair<const std::pair<std::basic_string<char>, std::basic_string<char> >

我正在使用std::pair<string, string>make_pair()創建一個std::map使用這對字符串。 但是我收到以下編譯錯誤:

/opt/rh/devtoolset-7/root/usr/include/c++/7/ext/new_allocator.h:140:22: error: use of deleted function 'std::pair<const std::pair<std::basic_string<char>, std::basic_string<char> >, firmware_data>::~pair()'
  destroy(_Up* __p) { __p->~_Up(); }

我所做的聲明如下:

typedef std::pair<std::string, string> FirmwareKey_t;
typedef std::map<FirmwareKey_t, firmware_data_t> FirmwareDataMap_t;

其中firmware_data_t是一個結構體 object,定義為:

typedef struct firmware_data {
  string name;
  value_t abc; // value_t is of union type
  bool configurable;
  update_status_t def; //update_status_t is of enum type

} firmware_data_t;

聯盟宣言:

typedef union value {
  string string_val;
  bool boolean_val;
  int64_t int_val;
  uint uint_val;
} value_t;

錯誤是說mapvalue_type (又名std::pair<const Key, T> )具有已刪除的析構函數。

為此, map::key_typemap::mapped_type類型(在本例中分別為FirmwareKey_tfirmware_data_t )具有已刪除的析構函數。 FirmwareKey_t顯然不是這種情況,因此它必須是firmware_data_t ,它包含union類型的value_t成員。 根據 cppreference

(C++11 起)如果聯合包含一個非靜態數據成員和一個非平凡的特殊成員 function(復制/移動構造函數、復制/移動賦值或析構函數),則 function 在聯合中默認被刪除並且需要由程序員明確定義。

這意味着union中的一個字段是具有定義的析構函數的非平凡類型,因此union本身具有已刪除的析構函數,因此任何使用union作為數據成員的類型也具有已刪除的析構函數,等等。

而且,實際上, union中的那個字段是string string_val字段。

所以,你需要修復你的union 由於std::string需要銷毀,因此您需要為union顯式定義析構函數以調用std::string的析構函數,但前提是string_valunion的活動字段,例如:

union value_t {
  string string_val;
  bool boolean_val;
  int64_t int_val;
  uint uint_val;

  ~value_t() {
    if (some condition indicating string_val is active) {
      string_val.~string();
    }
  }
};.

您還需要為您的union定義一個復制構造函數和復制賦值運算符。

也就是說,更好的解決方案是使用std::variant而不是union std::variant是一個類型安全的union ,可以自動為您處理這些細節。

using value_t = variant<string, bool, int64_t, uint>;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM