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

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

#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);
....

returns以下编译错误:

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 曾经说过的:

As required by C++11, we've implemented emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() in all containers for "arbitrary" numbers of arguments (see below).

(...)

VC10 supported emplacement from 1 argument, which was not especially useful.

最好的解决办法是升级到最新版本的编译器。

以下一些扩展可以解决您的问题

#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。