gpt4 book ai didi

c++ - std::unordered_map 使用 emplace 函数插入时出错

转载 作者:行者123 更新时间:2023-12-04 12:12:48 24 4
gpt4 key购买 nike

std::unordered_map 中插入元素时出现这个奇怪的错误使用 emplace功能,但如果我使用 operator[] 则不然函数重载。这是我的代码:

#include <iostream>
#include <unordered_map>
#include <memory>

class B {
public:
B() = default;
~B() = default;
};

class A {
public:
A() = default;
~A() = default;

std::unique_ptr<B> b_ptr;
};

int main() {
std::unordered_map<std::string, A> mp;
// mp.emplace("abc", A()); // gives compiler here
auto& a = mp["def"];
}
编译时我得到了巨大的错误打印。这是错误的简短说明: template argument deduction/substitution failed

最佳答案

如果您使用的是 C++17 或更高版本,请替换

// mp.emplace("abc", A());
mp.try_emplace("abc");
编译正常。
原因 mp.emplace("abc", A());产生编译错误的是子表达式 A()构造一个类型为 A 的新对象在 main()的范围等等 emplace()期望将这个新对象作为参数直接转发到一些 A构造函数,但没有这样的构造函数(换句话说,在 emplace() 方法的定义中,有类似代码 A(A()) 的东西,它是未定义的)。
如别处所述,向 class A 添加移动构造函数与代码 A(A&&) = default;还将修复编译错误(尽管此修复可能不适用于其他更复杂的类)。这消除错误的原因是因为现在存在一个构造函数 emplace()可以转发这个 A() object into(作为参数)。即代码 A(A())变得明确。

关于c++ - std::unordered_map 使用 emplace 函数插入时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69378099/

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