gpt4 book ai didi

c++ - unordered_map.emplace 给出编译器时间错误?

转载 作者:行者123 更新时间:2023-11-30 02:27:49 24 4
gpt4 key购买 nike

我将这个容器作为类中的一个成员:

std::unordered_map<std::string, Fruit> m_fruits;

我想在同一个类中向它添加一个新元素,我尝试了两种方法,两种方法都应该基于示例工作。 (在 emplace 的页面上)但是我在某个地方犯了一个错误。 (fruitName 是一个 const std::string& )

m_fruits.emplace(fruitName, Fruit());

Error C2660 'std::pair::pair': function does not take 2 arguments

m_fruits.emplace(std::make_pair(fruitName, Fruit()));

Error C2440 '': cannot convert from 'initializer list' to '_Mypair'

水果类:

class Fruit {

public:
Fruit();
Fruit(const Fruit& fruit) = delete;
Fruit operator=(const Fruit& fruit) = delete;
virtual ~Fruit();
};

更新:

我发现我不应该删除 fruit 的默认复制构造函数。

但是我不明白。 emplace 不是为了将对象构建到容器中,而不是在容器外部创建对象然后将其复制到容器中吗?

Inserts a new element into the container constructed in-place with the given args if there is no element with the key in the container.

请有人解释为什么我需要一个复制构造函数来使用这个方法。谢谢!

最佳答案

这就是 std::pair 代码所做的

_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
pair(const _T1& __x, const _T2& __y)
: first(__x), second(__y) {}

根据上面的代码,参数是从复制或移动构造函数构造的。因此,您需要其中之一。

Fruit 类没有定义复制构造函数或移动构造函数。此处,m_fruits.emplace(fruitName, Fruit()) 编译器生成临时 Fruit 对象,该对象必须在映射内复制构造或移动构造。由于 Fruit 类的复制构造函数被删除并且没有移动构造函数,因此它给出了编译器错误。有两种方法可以消除此错误

1)引入移动构造函数

Fruit(Fruit && other) {
}

2) 或者不删除拷贝构造函数,而是定义拷贝构造函数

水果(常量水果和其他){

这是工作片段

#include <iostream>
#include <unordered_map>

class Fruit {
public:
Fruit() {}
Fruit(const Fruit& fruit) {
}
Fruit operator=(const Fruit& fruit) = delete;
~Fruit() {}
};

int main() {
std::unordered_map<std::string, Fruit> m_fruits;

m_fruits.emplace("apple", Fruit());
m_fruits.emplace(std::make_pair("orange", Fruit()));
for (const auto & e: m_fruits) {
std::cout << "key=" << e.first << std::endl;
}
}

关于c++ - unordered_map.emplace 给出编译器时间错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41317880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com