![](/img/trans.png)
[英]conversion from std::map<std::basic_string<char>,std::pair<int,int(*)(const std::vector::Mat
[英]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;
錯誤是說map
的value_type
(又名std::pair<const Key, T>
)具有已刪除的析構函數。
為此, map::key_type
或map::mapped_type
類型(在本例中分別為FirmwareKey_t
和firmware_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_val
是union
的活動字段,例如:
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.