繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM