C++无法将变量值插入std::map,make_pair调用报错如何解决?
问题原因
你调用make_pair时错误地显式指定了模板参数,导致参数类型不匹配。std::make_pair的设计初衷是自动推导传入参数的类型生成对应pair实例,它的形参是万能引用(T&&),当你显式指定模板参数为std::string, int时,它期望接收的参数是std::string&&和int&&(右值引用),而你传入的three和num都是左值,左值无法直接绑定到非const右值引用,因此编译报错。
你写的第一行插入能正常编译,是因为传入的字符串字面量、数字字面量都是右值,刚好匹配显式指定的模板参数对应的形参类型。
正确修改方案
下面几种改法都可以实现需求,按需选择即可:
- 方案1:去掉
make_pair的显式模板参数,让其自动推导类型,这是最推荐的用法,符合make_pair的设计初衷:
int_map.insert(make_pair(three, num));
- 方案2:显式构造
std::pair对象,替代make_pair:
int_map.insert(pair<string, int>(three, num));
- 方案3:使用C++11及以上版本支持的花括号初始化语法,写法更简洁:
int_map.insert({three, num});
- 方案4:直接使用
std::map的[]运算符赋值,如果对应的键不存在会自动插入,存在则会覆盖原有值:
int_map[three] = num;
内容的提问来源于stack exchange,提问作者Kenneth Chen
相关产品推荐
相关产品推荐

