【问题标题】:unique_ptr(std::nullptr_t) and templatesunique_ptr(std::nullptr_t) 和模板
【发布时间】: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


    【解决方案1】:

    这里:

    return m_components[&typeid(T)];
    

    您正试图返回地图中唯一指针之一的副本。无法复制唯一指针;只有一个人可以拥有任何给定的对象,因此名称的“独特”部分。

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

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

    另外,你不应该调用函数__GetComponent。那是reserved name

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多