为什么在使用unordered_map的emplace方法时会出现编译错误?

Why do I get a compilation error when using the emplace method for unordered_map?

本文关键字:编译 错误 方法 emplace unordered map 为什么      更新时间:2023-10-16
#include <string>
#include <unordered_map>
using namespace std;
....
....
unordered_map<char, int> hashtable;
string str = "hello";
char lower = tolower(str[0]);
hashtable.emplace(lower, 1);
....

返回以下编译错误:

1   error C2780: 'std::pair<_Ty1,_Ty2> std::_Hash<_Traits>::emplace(_Valty &&)' : expects 1 arguments - 2 provided  
2   IntelliSense: no instance of function template "std::tr1::unordered_map<_Kty, _Ty, _Hasher, _Keyeq, _Alloc>::emplace [with _Kty=char, _Ty=int, _Hasher=std::hash<char>, _Keyeq=std::equal_to<char>, _Alloc=std::allocator<std::pair<const char, int>>]" matches the argument list

您使用的是旧版本的Visual c++,它不能正确支持emplace。可能是Visual c++ 2010

正如Visual c++ Team Blog曾经说过的:

按照c++ 11的要求,我们已经实现了安置()/emplace_front ()/emplace_back ()/emplace_hint ()/emplace_after ()

(…)

VC10支持从1个参数进行定位,但不支持尤其有用。

最好的解决方案是升级到最新版本的编译器

下列扩展可以解决您的问题

#include <utility> // for std::pair
std::unordered_map<char, int> hashtable;
char lower = 'A';
hashtable.emplace(std::pair<char, int>(lower, 1));

如果您粘贴的代码编译器似乎依赖于底层编译器。处理放置std::pair适用于例如c++11——根据规范(例如cplusplus.com),您的代码片段应该适用于c++14。