警告:由于未打包的非POD字段std :: array而忽略打包的属性

问题描述 投票:0回答:1

[当我尝试使用__attribute__((packed))时,g++会给我有关POD的警告,但是当我启用gdb时,包装仍在工作(由__attribute__((packed))检查)。

如何解决有关std::array的警告?

代码:

class DataBlock_Offsets {
public:
  uint32_t sma_offset;
  uint32_t data_offset;
  uint32_t string_offset = 0;
  uint32_t dict_offset = 0;
};

template<size_t COLUMN_COUNT>
class DataBlock_Header {
 public:
  uint32_t tuple_count;
  uint64_t stop_offset;
  std::array<DataBlock_Offsets, COLUMN_COUNT> offsets;
  std::array<EncodingType, COLUMN_COUNT> encoding_types;
}
__attribute__((__packed__));

来自g++的完整警告是(假定模板参数为1:]

 warning: ignoring packed attribute because of unpacked non-POD field ‘std::array<imlab::util::DataBlock_Offsets, 1> imlab::util::DataBlock_Header<1>::offsets’
   std::array<DataBlock_Offsets, COLUMN_COUNT> offsets;
                                               ^~~~~~~
c++ g++
1个回答
0
投票

什么使您认为这与std::array有关?这实际上是关于DataBlock_Offsets不是POD,这意味着它们都不是std::array

具有默认成员初始值设定项的类型不是POD类型,因为其默认构造函数不能无关紧要。 POD类型必须是琐碎的类型。因此,如果您希望这样做,请从DataBlock_Offsets中删除默认的成员初始化器。或要求打包DataBlock_Offsets

© www.soinside.com 2019 - 2024. All rights reserved.