具有带参数的构造函数的自定义类的映射
map with custom class having constructor with argument
当我为构造函数定义一个参数时,它的对象不能设置为映射:
#include <map>
class Foo
{
public:
int fooInt;
Foo(int fooInt)
: fooInt(fooInt)
{};
};
int main()
{
Foo foo(2);
std::map<int, Foo> fooMap;
fooMap[1] = foo;
return 0;
}
// won't compile
如果没有参数(即定义Foo()
并声明Foo foo
),则此操作有效。为什么?
事实上,我觉得我错过了一些非常基本的东西。。。但我搞不明白这条长长的错误信息是什么意思。
这是因为如果键在映射中不存在,operator[]
将插入默认构造的对象。
您可能正在为非默认可构造对象类型寻找insert
。
std::map::operator[]
要求值类型(或mapped_type
)满足DefaultInsertable概念。来自[地图访问]:
T& operator[](const key_type& x);
效果:如果映射中没有等效于
x
的键,则将value_type(x, T())
插入到映射中
要求:key_type
为CopyInsertable
,mapped_type
为DefaultInsertable
为*this
返回:对*this
中x
对应的mapped_type
的引用
复杂性:对数
Foo
声明了它自己的构造函数,该构造函数禁止隐式生成默认构造函数,因此它不是默认可构造的。
解决方案是要么声明一个默认构造函数,要么使用emplace()
方法就地构造一个值类型:
fooMap.emplace(1, foo);
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++ 映射的键/值的用户自定义名称?
- 定义具有非标准签名的自定义映射比较器
- 在自定义类型图中重用 SWIG 映射
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 使用自定义比较器C++映射,不插入所有元素
- 如何正确使用带有智能指针和自定义类的映射作为键和值
- C++:对象键的多映射自定义比较器
- 自定义映射类中的分段错误
- 为boost哈希映射定义自定义哈希函数
- STL 映射自定义比较器
- 自定义类指针作为无序映射键
- 映射引发错误中的 C++ 自定义对象
- 标准::映射的自定义分配器失败
- 自定义类比较器的 STL 映射不起作用
- C++ 自定义映射键/值不按顺序排列
- C++ 对自定义映射迭代器函数的未定义引用
- 如何对自定义映射进行迭代
- 在多线程应用程序中读写自定义映射时堆损坏
- 为不使用元组的自定义映射模拟std::map迭代器