[英]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.