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

时间:2015-08-07 16:12:14

标签: c++ hashtable 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);
....

返回以下编译错误:

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

2 个答案:

答案 0 :(得分:1)

您使用的旧版Visual C ++不能正确支持emplace。可能是Visual C ++ 2010。

正如Visual C++ Team Blog曾经说过:

  

根据C ++ 11的要求,我们已经实现了   布设()/ emplace_front()/ emplace_back()/ emplace_hint()/ emplace_after()   在所有容器中“任意”数量的参数(见下文)。

     

(...)

     

VC10支持从1个参数进驻,但事实并非如此   特别有用。

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

答案 1 :(得分:1)

遵循一些可以解决问题的扩展

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

如果您的粘贴代码编译似乎取决于底层编译器。处理std ::对的工作适用于例如c ++ 11 - 根据规范(例如cplusplus.com),你的代码片段应该与c ++ 14一起使用。