如何构造包含联合的结构的unique_ptr?

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

我正在尝试构建一个包含枚举的std::unique_ptr指针,以及两个结构元素的并集:

struct button_t
{
  std::uint8_t id;
  std::uint16_t status;
};

struct led_t
{
  std::uint8_t id;
  std::uint16_t status;
};

struct message_t
{
  enum class id_e : std::uint8_t { button_e, led_e } id;
  union
  {
    button_t button;
    led_t led;
  };

  message_t(message_t::id_e id, const button_t& button) : id(id), button(button) {}
  message_t(message_t::id_e id, const led_t& led) : id(id), led(led) {}
};

当我尝试使用std::unique_ptr构建std::make_unique如下:

button_t button{56, 78};
typedef std::unique_ptr<message_t> p_msg_t;
auto msg = std::make_unique<p_msg_t>(message_t::id_e::button_event, button);

我收到以下编译错误:

error: no matching function for call to 'std::unique_ptr<message_t>::unique_ptr(message_t::id_e, button_t&)'

有人可以帮我确定问题所在吗?

c++ c++11 structure unique-ptr unions
1个回答
1
投票

问题已在评论中得到解答。但请注意,您可以避免冗余的“类型”参数,因为您可以从传递给构造函数的io对象推断它:

#include <cstdint>
#include <memory>

struct button_t
{
  std::uint8_t id;
  std::uint8_t status;
};

struct led_t
{
  std::uint8_t id;
  std::uint16_t status;
};

struct message_t
{
  enum class id_e : std::uint8_t { button_e, led_e } id;
  union
  {
    button_t button;
    led_t led;
  };

  explicit message_t(const button_t& button) 
  : id(message_t::id_e::button_e)
  , button(button)
  {
  }

  explicit message_t(const led_t& led) 
  : id(message_t::id_e::led_e)
  , led(led)
  {
  }

};


int main()
{
    button_t button{56, 78};
    auto msg = std::make_unique<message_t>(button);
    msg = std::make_unique<message_t>(led_t { 43, 12 });
}
© www.soinside.com 2019 - 2024. All rights reserved.