簡體   English   中英

unique_ptr(std :: nullptr_t)和模板

[英]unique_ptr(std::nullptr_t) and templates

我正在為游戲制作一個組件實體系統。

我有一個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)];

您正在嘗試返回地圖中唯一指針之一的副本。 唯一的指針不能被復制; 只有一個人可以擁有任何給定的對象,因此是名稱的“唯一”部分。

該錯誤消息相當隱晦; 一個更明智的編譯器會抱怨復制構造函數被刪除,這應該清楚出什么問題。 顯然,這完全忽略了復制構造函數,僅提及了另一個不合適的構造函數。

尚不清楚您實際上想要返回什么,以及如何管理對象的所有權。 您需要確定管理對象的策略,並適當使用智能指針。 也許您想從地圖上刪除該元素並返回其唯一指針(通過移動它)。 也許您想創建該對象的新副本並返回一個唯一的指針來管理該對象。 也許您想返回一個非所有者指針; 但是,如果它不在地圖中,那么就不清楚該怎么做(也許添加一個新元素?)。 也許您想存儲和返回共享指針,以便它們可以保留在地圖中,但與調用此函數的人共享所有權。 也許您想做一些完全不同的事情。

另外,您不應調用__GetComponent函數。 那是保留名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM