[英]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.