繁体   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