[英]Error instantiating std::map with std::shared_ptr with XCode/Clang
編輯了更多代碼,再現了錯誤,將地圖更改為unordered_map。
我已經離開並且為純目標C編寫代碼已有一年多了,所以如果這是一個新手錯誤,請原諒!
我在針對iOS 7模擬器的XCode 5中編譯為.mm(Objective-C ++)。 它使用clang-503.0.40。 基於LLVM 3.4。
這是代碼:
typedef uint32_t uint32;
class Actor {
public:
std::string name;
std::set<uint32> behaviors;
Actor() { }
private:
};
class Location {
public:
// .. some stuff ...
std::unordered_map<uint32,std::shared_ptr<Actor>> actors; // A list of actors in the location
Location() { }
private:
};
然后在一個函數中我做-
std::shared_ptr<Location> l1(new Location);
std::shared_ptr<Actor> npc(new Actor);
l1->actors.emplace(npc); // ERROR HAPPENS HERE
我將其更改為無序地圖,因為我無法提供“較少”且不需要訂購。
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/unordered_map:544:11:沒有匹配的構造函數,用於初始化“ value_type”(也稱為“ pair”)
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/memory:1641:31:實例化功能模板特化'std :: __ 1 :: __ hash_value_type> :: __ hash_value_type& >'在這里要求
有一長串候選構造函數被排除在外,如果您需要查看它們,還可以進行其他操作。
那我犯什么新手錯誤呢?
映射的Emplace需要一個參數作為鍵,然后為要放置的事物添加后續參數。 所以
l1->actors.emplace(npc);
無法工作,因為它僅提供一個參數-沒有鍵。 因為您已經在地圖中構造了想要的東西,所以您根本不需要emplace
。 您需要指定要將元素放置在哪個鍵上,然后最簡單的選擇是
l1->actors[42] = npc;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.