我正在尝试创建一个包含具有不同参数的对象的地图。
但是我发现在插入对之后,对象将被破坏。
如果我尝试在此对象中使用该函数。例如:
#include <map>
#include <iostream>
class Test{
public:
Test(double value) : value_(value){}
~Test(){std::cout<< "destroyed";}
void plusone() {value_ += 1;}
private:
double value_;
};
int main(){
std::map<long, Test> map;
map.insert(std::make_pair(1, Test(1.2)));
map[1].plusone();
return 0;
}
它将显示: [错误]没有匹配函数来调用&#39; Class :: Class()&#39;
[注意]候选人需要1个参数,0提供
我该怎么做?
答案 0 :(得分:1)
语法map[1]
只能在映射类型具有默认构造函数时使用。这是因为如果找不到密钥,则插入一个默认构造的对象,但编译器必须在编译时为此生成代码。
如果您不想添加默认构造函数,则必须使用不同的查找代码,例如:
auto it = map.find(1);
if ( it != map.end() )
it->second.memberfuncion();
此外,您的错误消息与销毁对象无关,正如标题所示。
在代码map.insert(std::make_pair(1, Class(argument)));
中,您创建一个临时对象Class(argument)
,并将其复制到地图中。然后,临时对象被销毁。
如果您想避免这种情况并直接在地图中构建,请使用map.emplace(1, argument);
。
答案 1 :(得分:0)
通过map.operator[]
requires your mapped type to be default constructible进行商品访问。
如果它不是默认可构造的,请使用没有此类要求的map.find
。