【发布时间】:2016-12-25 00:28:56
【问题描述】:
我有这个容器作为一个类的成员:
std::unordered_map<std::string, Fruit> m_fruits;
我想在同一个类中添加一个新元素,我尝试了两种方法,两种方法都应该基于示例工作。 (在 emplace 的页面上)但是在某个地方我犯了一个错误。 (fruitName 是一个 const std::string&)
m_fruits.emplace(fruitName, Fruit());
错误 C2660 'std::pair::pair': 函数不接受 2 个参数
m_fruits.emplace(std::make_pair(fruitName, Fruit()));
错误 C2440 '':无法从 'initializer 转换 列表”到“_Mypair”
水果类:
class Fruit {
public:
Fruit();
Fruit(const Fruit& fruit) = delete;
Fruit operator=(const Fruit& fruit) = delete;
virtual ~Fruit();
};
更新:
我发现我不应该删除fruit的默认复制构造函数。
但我不明白。 emplace 不是用于将对象构造到容器中而不是在容器外部创建对象然后将其复制到容器中吗?
如果容器中没有带有键的元素,则使用给定的参数就地将新元素插入到容器中。
请有人解释为什么我需要一个复制构造函数来使用这个方法。 谢谢!
【问题讨论】:
-
你能提供一个minimal reproducible example吗?只需对
Fruit使用虚拟声明,例如struct Fruit {};。_Mypair也很可疑,它看起来不像标准的 c++ 实现。 -
m_fruits[fruitName] = Fruit();怎么样 -
@πάνταῥεῖ --
_Mypair绝对是一种广泛使用的标准库实现的风格。 -
@Pete 好吧,虽然命名很愚蠢。
-
@πάνταῥεῖ -- 叹息。
标签: c++ c++11 dictionary containers