【发布时间】:2014-08-26 05:38:42
【问题描述】:
我正在为游戏制作组件实体系统。
我有一个类,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 的转换?
我也收到每个组件的此错误,而不仅仅是列出的“位置”组件。
【问题讨论】:
标签: c++ templates components