gpt4 book ai didi

c++ - unique_ptr(std::nullptr_t) 和模板

转载 作者:行者123 更新时间:2023-11-28 06:48:02 34 4
gpt4 key购买 nike

我正在为游戏制作组件实体系统。

我有一个类,Object,它只是一个用于容纳组件的外壳,这些组件又作为 (typeid, unique_ptr<>) 对存储在 std::map 中的对象中。每个组件都是派生自 Component 的类。

Object 类有几个模板函数(虽然类本身不是模板)以方便对组件的访问和修改。模板定义与类定义一起位于头文件中(以避免链接器错误)。

编译时,我收到以下错误(在 VS2012 中):

error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(std::nullptr_t) throw()' : cannot convert parameter 1 from 'std::unique_ptr<_Ty>' to 'std::nullptr_t'
with
[
_Ty=Positional,
_Dx=std::default_delete<Positional>
]
and
[
_Ty=Component
]
nullptr can only be converted to pointer or handle types
see reference to function template instantiation 'std::unique_ptr<_Ty,_Dx> Object::__GetComponent<Positional>(void)' being compiled
with
[
_Ty=Positional,
_Dx=std::default_delete<Positional>
]

引用以下函数:

template <typename T> std::unique_ptr<T>
Object::__GetComponent()
{
if(m_components.count(&typeid(T)) != 0)
{
return m_components[&typeid(T)];
}
else
{
return std::unique_ptr<T>(new T);
}
}

这是怎么回事?我没有在我的代码中的任何地方使用自定义删除器,也没有尝试将 nullptr 存储在 unique_ptr 实例中。我想更具体地说,是什么试图导致从 unique_ptr<> 到 nullptr_t 的转换?

我还收到每个组件的此错误,而不仅仅是列出的“位置”组件。

最佳答案

这里:

return m_components[&typeid(T)];

您正在尝试返回 map 中唯一指针之一的拷贝。唯一指针不可复制;只有一个人可以拥有任何给定的对象,因此是名称的“唯一”部分。

错误信息相当含糊;一个更明智的编译器会提示复制构造函数被删除,这应该清楚什么是错误的。这显然完全忽略了复制构造函数,而只提到了一个不同的、不合适的构造函数。

并不完全清楚您实际想要返回什么,以及应该如何管理对象的所有权。您需要决定管理对象的策略,并适本地使用智能指针。也许您想从 map 中删除该元素并返回其唯一指针(通过移动它)。也许您想制作该对象的新拷贝并返回一个管理该对象的唯一指针。也许您想返回一个非拥有指针;但是如果它不在 map 中则不清楚该怎么办(添加一个新元素,也许?)。也许您想存储和返回共享指针,以便它们可以保留在 map 中,但与调用此函数的人共享所有权。也许您想做一些完全不同的事情。

此外,您不应调用函数 __GetComponent。那是一个 reserved name .

关于c++ - unique_ptr(std::nullptr_t) 和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581787/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com