使用带有XCode / Clang的std :: shared_ptr实例化std :: map时出错

时间:2014-06-28 14:02:58

标签: c++ xcode5 clang objective-c++ stdmap

编辑了更多重现错误的代码,将地图更改为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

我将其更改为无序地图,因为我无法提供更少的&#34;并且不需要订购。

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c ++ / v1 / unordered_map:544:11:没有用于初始化&#39; value_type&#39;的匹配构造函数(又名&#39;对&#39;)

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c ++ / v1 / memory:1641:31:在实例化函数模板特化&#39; std :: __ 1 :: __hash_value_type&gt; :: __ hash_value_type&amp;&gt;&#39;请求

如果您需要看到它们,那么排除了一长串候选构造函数以及其他类似的东西。

那么我做的新手错误是什么?

1 个答案:

答案 0 :(得分:1)

映射的Emplace需要一个关键字参数,然后是放置事物的后续参数。所以

l1->actors.emplace(npc);

无法工作,因为它只提供一个参数 - 没有密钥。你根本不需要emplace,因为你已经在地图中构建了你想要的东西。您需要指定要放置元素的键,然后最简单的选项是

l1->actors[42] = npc;