c++ 没有合适的构造函数可从枚举转换为基础类型

xkftehaa  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(216)

我有一个在这里定义的枚举类

// namespace Types
enum class MessageType : uint32_t
{
  COMPUTE_SUM_MESSAGE = 1
};

我想要一个可以接受枚举值并将其转换为字节数组的函数。我试图使用underlying_type将我的枚举值从MessageType转换为uint32_t,但我得到了一个不存在合适的构造函数来转换它。

void ConvertMessageTypeToByteArray(Types::MessageType message_type)
{
  using MessageTypeUnderlying = std::underlying_type<Types::MessageType>;
  // Can not static cast the message_type to MessageTypeUnderlying 
  MessageTypeUnderlying data = static_cast<MessageTypeUnderlying>(message_type);
}

我想把message_type作为一个无符号的32位整数,这是它的底层类型。

h5qlskok

h5qlskok1#

您的using语句是错误的。它将MessageTypeUnderlying定义为std::underlying_type结构体本身的别名,而不是它所代表的枚举的实际基础类型。因此,当您尝试将枚举值转换为结构体类型时,您会得到错误。编译器的完整错误消息应该向您指出这一点。
要解决这个问题,您需要将MessageTypeUnderlying定义为std::underlying_type::type字段指定的类型的别名:

成员类型

姓名定义
typeT的基础类型
using MessageTypeUnderlying = std::underlying_type<Types::MessageType>::type;

或者,在C++14及更高版本中,您可以使用helper别名std::underlying_type_t

帮助器类型

x一个一个一个一个x一个一个二个x
也就是说,C++23增加了std::to_underlying(),它完全可以完成您手动尝试的操作:
将枚举转换为其基础类型。等效于return static_cast<std::underlying_type_t<Enum>>(e);

auto data = std::to_underlying(message_type);

相关问题