【问题标题】:Error instantiating std::map with std::shared_ptr with XCode/Clang使用 XCode/Clang 使用 std::shared_ptr 实例化 std::map 时出错
【发布时间】:2014-06-28 14:02:57
【问题描述】:

编辑了更多重现错误的代码,将地图更改为 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 &>' 在这里请求

有一长串候选构造函数被排除在外,如果您需要查看它们,还有其他类似的东西。

那么我犯了什么新手错误?

【问题讨论】:

  • 您能否提供有关代码和错误的更多详细信息?
  • @sfjac 还有哪些详细信息?我认为不需要更多。但我不是objective-c++ 专家。
  • 不知道 - 足以重现。 C++ 没有任何问题,即使我把它放在一个 .mm 文件中(我是 C++ 人,不是 ObjC),一切都会编译。
  • 添加了详细信息,我一直没有使用 XCode 调试 C++,忘记了如何找到它发生的确切行。代码现在重现错误
  • 如果你早点给出失败的行,你会得到一个更快的答案。

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


【解决方案1】:

地图的Emplace 需要一个参数作为键,然后是被放置的东西的后续参数。所以

l1->actors.emplace(npc);

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

l1->actors[42] = npc;

【讨论】:

  • 谢谢。你暴露了一个愚蠢的逻辑,我应该使用一个集合!我已经习惯了 OBJ-C 容器,我忘记了一些非常基本的东西......
猜你喜欢
  • 2016-05-23
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2012-10-29
相关资源
最近更新 更多