我为游戏制作了一个组件 - 实体系统。
我有一个类Object,它只是一个保存组件的shell,而后者又作为(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&lt;&gt;转换到nullptr_t?
我也会收到每个组件的错误,而不仅仅是“定位”错误。一个上市。
答案 0 :(得分:1)
下面:
return m_components[&typeid(T)];
您正在尝试返回地图中某个唯一指针的副本。唯一指针无法复制;只有一个人可以拥有任何给定的对象,因此名称的“唯一”部分。
错误信息相当神秘;一个更明智的编译器会抱怨复制构造函数被删除,这应该清楚地说明了什么是错的。这显然完全忽略了复制构造函数,只提到了一个不同的,不合适的构造函数。
您实际想要返回的内容以及如何管理对象的所有权并不完全清楚。您需要决定管理对象的策略,并适当地使用智能指针。也许你想从地图中删除元素并返回它的唯一指针(通过移动它)。也许你想制作一个新的对象副本并返回一个管理它的唯一指针。也许你想要返回一个非拥有指针;但是如果它不在地图中(或者添加一个新元素,那么它不清楚该怎么办)。也许您希望存储和返回共享指针,以便它们可以保留在地图中,但与调用此函数的任何人共享所有权。也许你想做一些完全不同的事情。
此外,您不应该调用函数__GetComponent
。那是reserved name。