具有带参数的构造函数的自定义类的映射

map with custom class having constructor with argument

本文关键字:自定义 映射 构造函数 参数      更新时间:2023-10-16

当我为构造函数定义一个参数时,它的对象不能设置为映射:

#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_typeCopyInsertablemapped_typeDefaultInsertable*this
返回:对*thisx对应的mapped_type的引用
复杂性:对数

Foo声明了它自己的构造函数,该构造函数禁止隐式生成默认构造函数,因此它不是默认可构造的。

解决方案是要么声明一个默认构造函数,要么使用emplace()方法就地构造一个值类型:

fooMap.emplace(1, foo);