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西红柿,西红柿,不是吗?在这种情况下,我们讨论的是一些具体的东西,比如我们可能不想看到的按钮。如果将弹出开关误认为是“安全带锁定”灯,那就太可惜了,所以可能是的。