C++ 通过唯一_指针在地图中存储传递的对象

C++ 通过唯一_指针在地图中存储传递的对象,c++,C++,我在大学的一个c++项目中遇到了以下问题: 我想用地图来存储Class1的一些对象。 由于项目的设计,将映射作为成员变量保存的类不会创建要存储在映射中的对象。我在这个论坛上的研究告诉我使用unique_ptr传递这些对象 在测试项目中结合这两种想法进行实验时: #include <iostream> #include <memory> #include <unordered_map> typedef std::unique_ptr<std::strin

我在大学的一个c++项目中遇到了以下问题:
我想用地图来存储Class1的一些对象。 由于项目的设计,将映射作为成员变量保存的类不会创建要存储在映射中的对象。我在这个论坛上的研究告诉我使用unique_ptr传递这些对象

在测试项目中结合这两种想法进行实验时:

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

typedef std::unique_ptr<std::string> string_ptr;

class Class1 {
public:
    std::unordered_map<std::string, string_ptr> my_unordered_map;

    Class1() : my_unordered_map(){
    }

    void addTo(string_ptr ptr) {
        std::string string = *ptr;
        std::cout << string << std::endl;
        my_unordered_map[0] = std::move(ptr);
    }
};


int main() {
    std::cout << "Process started!"<< std::endl;

    string_ptr ptr;
    ptr = std::make_unique<std::string>("text");

    Class1 cont;
    cont.addTo(std::move(ptr));


}
#包括
#包括
#包括
typedef std::唯一的\u ptr字符串\u ptr;
一班{
公众:
std::无序地图我的无序地图;
Class1():我的无序地图(){
}
void addTo(字符串\u ptr ptr){
std::string string=*ptr;
std::cout这里

您正在将
int
作为键传递,但是
my\u unordered\u map
期望
std::string
作为键,解决方案:

my_unordered_map[string] = std::move(ptr);

在抛出“std::logic_error”实例后调用terminate what():基本\u字符串::\u M\u构造null无效

std::string
具有来自
char const*
的隐式转换构造函数,这意味着试图从空指针构造
std::string
,这是什么导致了此错误

如果需要空字符串,请执行以下操作

my_unordered_map[std::string("")] = std::move(ptr);
这里

您正在将
int
作为键传递,但是
my\u unordered\u map
期望
std::string
作为键,解决方案:

my_unordered_map[string] = std::move(ptr);

在抛出“std::logic_error”实例后调用terminate what():基本\u字符串::\u M\u构造null无效

std::string
具有来自
char const*
的隐式转换构造函数,这意味着试图从空指针构造
std::string
,这是什么导致了此错误

如果需要空字符串,请执行以下操作

my_unordered_map[std::string("")] = std::move(ptr);

您的问题与
unique\u ptr
无关。它与您的值对象无关。实际上是与您的键有关。不幸的是,整数文本为0(并且只有0,而不是值为0的int变量)可以被视为任何类型的指针。而且不幸的是,
std::string
具有来自
char const*
的隐式转换构造函数。因此,当您执行此操作时:

my_unordered_map[0] = std::move(ptr);

由于您的键类型是
std::string
,因此您正在从空指针隐式构造一个
std::string
。这是您的错误。

您的问题与
unique\u ptr
无关。它与值对象完全无关。它实际上与您的键有关。不幸的是,整数文本0(并且只有0,而不是值为0的int变量)可以被视为任何类型的指针。而且不幸的是,
std::string
有一个来自
char const*
的隐式转换构造函数。因此,在执行此操作时:

my_unordered_map[0] = std::move(ptr);


由于您的密钥类型是
std::string
,因此您正在从空指针隐式构造一个
std::string
。这是您的错误。

只存储字符串,而不是唯一的\u ptr。正如最后提到的,我要存储的对象不是字符串。或者我没有领会您的意思吗?@NewBe然后给我们一个覆盖真实情况的例子。重点是很可能没有理由存储
unique\u ptr
而不是
string
@user0042:这是一个MCVE。只存储字符串,而不是unique\u ptr。正如最后提到的,我想存储的对象不是字符串。或者我没有领会你的意思吗?@NewBe然后告诉我们一个真实情况。重点是,很可能没有理由继续存储
unique\u ptr
而不是
string
@user0042:这是一个MCVE。我怀疑OP真正想要的是使用空字符串作为密钥。哦,我的天哪。即使不连续编码10个小时也是失败的借口。因为我从来没有使用过uniqu\u ptr,我之前就在期待这个神秘错误消息的复杂原因。我事实上,只是我使用了0而不是有效字符串…感谢您抽出时间!发生了:-)现在一切都好了吗?我怀疑使用空字符串作为键是OP真正想要的。哦,我的天啊。甚至连连续10小时的编码都不能作为失败的借口。因为我从来没有使用过uniqu_ptrs,在我期待这个神秘错误消息的复杂原因之前。事实上,我只是使用了0而不是有效的字符串…谢谢你我们的时代!事情发生了:-)现在一切都好了吗?你为什么发布相同的答案?@FilipKočica:我没有。我在你的答案发布之前就在写我的答案。当你的答案最终发布时,它并没有令人满意地解释情况。你只是说“你不能这样做”。事实上你能做到。他做到了。在我看来,这已经足够解释了这一点,甚至在你发布之前就解决了他的问题:-)@FilipKočica:欢迎你接受这个观点。我不同意。好吧,祝你愉快。你为什么发布相同的答案?@FilipKočica:我没有。我在你的答案发布之前就已经写了。当你的答案最终是首字母时y发布了,它没有令人满意地解释情况。你只是简单地说“你不能这样做”。事实上你可以做到。他做到了。在我看来,它确实解释得足够了,甚至在你发布之前就解决了他的问题:-)@FilipKočica:欢迎你接受这个观点。我不会分享它。好的,祝你有愉快的一天。