当我为构造函数定义一个参数时,它的对象不能设置为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
),则可行。为什么呢?
我实际上认为我遗漏了一些非常基本的东西......但是我无法弄清楚长错误信息的含义。
答案 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
应为CopyInsertable
,mapped_type
为DefaultInsertable
*this
。
返回:对mapped_type
中与x
对应的*this
的引用 复杂性:对数
Foo
声明自己的构造函数,禁用隐式生成的默认构造函数,因此它不是默认构造函数。
解决方案是声明默认构造函数或使用emplace()
方法就地构造值类型:
fooMap.emplace(1, foo);