插入映射<字符串,结构>错误
Inserting in map<string, STRUCT> error
我有一个映射,其结构定义如下:
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进行隐式转换。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型