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

时间:2015-04-08 16:39:10

标签: c++

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

#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),则可行。为什么呢?

我实际上认为我遗漏了一些非常基本的东西......但是我无法弄清楚长错误信息的含义。

2 个答案:

答案 0 :(得分:8)

这是因为如果地图中的密钥已经存在,operator[]将插入默认的构造对象。

您可能正在为非默认构造对象类型寻找insert

答案 1 :(得分:4)

std::map::operator[]要求值类型(或mapped_type)满足DefaultInsertable概念。来自[map.access]:

T& operator[](const key_type& x);
     

效果:如果地图中没有等效于x的键,请将value_type(x, T())插入地图。
  要求:key_type应为CopyInsertablemapped_typeDefaultInsertable *this
  返回:对mapped_type中与x对应的*this的引用   复杂性:对数

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

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

fooMap.emplace(1, foo);