C++ 如何构造包含并集的结构的唯一_ptr?

C++ 如何构造包含并集的结构的唯一_ptr?,c++,c++11,structure,unique-ptr,unions,C++,C++11,Structure,Unique Ptr,Unions,我试图构造一个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 }

我试图构造一个
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::make_unique
构建
std::unique\u ptr
时,如下所示:

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);
按钮{56,78};
typedef std::unique_ptr p_msg_t;
auto msg=std::make_unique(消息\u t::id\u e::按钮\u事件,按钮);
我得到了以下编译错误:

错误:调用“std::unique\u ptr::unique\u ptr(message\u t::id\u e,button\u t&)”时没有匹配的函数。


有谁能帮我找出问题所在吗?

这个问题已经在评论中得到了回答。但请注意,您可以避免冗余的“type”参数,因为您可以从传递给构造函数的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 });
}
#包括
#包括
结构按钮
{
std::uint8\u t id;
std::uint8_t状态;
};
结构发光二极管
{
std::uint8\u t id;
标准:uint16_t状态;
};
结构消息
{
枚举类id:std::uint8{button\ue,led\ue}id;
协会
{
按钮(t)按钮;;
发光二极管;
};
显式消息(常量按钮和按钮)
:id(消息:id:按钮)
,按钮(按钮)
{
}
显式消息(常量指示灯和指示灯)
:id(消息\u t::id\u e::led\u e)
,发光二极管(led)
{
}
};
int main()
{
按钮{56,78};
auto msg=std::使_唯一(按钮);
msg=std::使_唯一(led_t{43,12});
}

make_unique不采用指针类型。您应该传递结构类型以使_唯一,即
std::make_唯一
Yes当然,谢谢!这些因素应该是明确的吗?对于1个参数来说,总是一个好问题。(这里的答案可能是否定的)@Yakk西红柿,西红柿,不是吗?在这种情况下,我们讨论的是一些具体的东西,比如我们可能不想看到的按钮。如果将弹出开关误认为是“安全带锁定”灯,那就太可惜了,所以可能是的。