为什么在使用 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。
#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。