插入映射<字符串,结构>错误

Inserting in map<string, STRUCT> error

本文关键字:结构 gt 错误 字符串 lt 插入 映射      更新时间:2023-10-16

我有一个映射,其结构定义如下:

struct kv_string {
        std::string value;
        long long exp_time;
        kv_string(const std::string& v): value(v), exp_time(-1) {}
};

现在,当我尝试使用插入新结构时

else if(qargs[0] == "set"){
    if(qargs.size()==3){
        kv_map.insert(std::make_pair( qargs[1], kv_string(qargs[2])));
    }
}

(qargs是vector<string>),我得到以下错误:

> In file included from /usr/include/c++/4.8/map:61:0,
>                      from structures.h:5:
>     /usr/include/c++/4.8/bits/stl_map.h: In instantiation of ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key,
> _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = std::basic_string<char>; _Tp = kv_string; _Compare =
> std::less<std::basic_string<char> >; _Alloc =
> std::allocator<std::pair<const std::basic_string<char>, kv_string> >;
> std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = kv_string;
> std::map<_Key, _Tp, _Compare, _Alloc>::key_type =
> std::basic_string<char>]’:
>     /usr/include/c++/4.8/stdexcept:281:48:   required from here
>     /usr/include/c++/4.8/bits/stl_map.h:469:59: error: no matching function for call to ‘kv_string::kv_string()’
>                __i = insert(__i, value_type(__k, mapped_type()));
>                                                                ^
>     /usr/include/c++/4.8/bits/stl_map.h:469:59: note: candidates are:
>     structures.h:11:9: note: kv_string::kv_string(const string&)
>              kv_string(const std::string& v): value(v), exp_time(-1) {}
>              ^
>     structures.h:11:9: note:   candidate expects 1 argument, 0 provided
>     structures.h:8:8: note: kv_string::kv_string(const kv_string&)
>      struct kv_string {
>             ^
>     structures.h:8:8: note:   candidate expects 1 argument, 0 provided
>     make: *** [server_main.o] Error 1

我还尝试添加一个额外的构造函数kv_string(){},但它出现了分段错误。

您想要的是:

kv_map.insert(std::make_pair(qargs[1], kv_string(qargs[2]));

或者这个:

kv_map.emplace(qargs[1], kv_string(qargs[2]);

或者,在C++17:中

kv_map.try_emplace(qargs[1], qargs[2]);

默认情况下,[]-运算符初始化一个新元素(如果给定键不存在),但类型kv_string不是默认可构造的。所以你不能使用那个运算符。上述操作也比[]-运算符更强大:它们向键处的元素返回迭代器,并返回有关键是否已经存在的信息。

C++编译器发出此错误消息,抱怨您的kv_string类缺少默认构造函数

/usr/include/c++/4.8/bits/stl_map.h:469:59: error: no matching function for call to ‘kv_string::kv_string()’
           __i = insert(__i, value_type(__k, mapped_type()));

如果您阅读了std::map::operator[]的文档,您会发现映射的类型(在您的案例中为kv_string)必须是默认可构造的

因此,如果这对您自己的设计有意义,您可以在kv_string结构中添加一个默认构造函数:

struct kv_string {
    // ...
    // Default constructor
    kv_string() : exp_time(-1 /* or whatever default value */) {}
};

作为附带说明,我还将您的kv_string(const std::string&)构造函数标记为explicit,以避免从string s进行隐式转换。