2015-08-07 3 views
0
#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); 
.... 

возвращает следующие ошибки компиляции:Почему возникает ошибка компиляции при использовании метода emplace для unordered_map?

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 
+0

Если это VS <2013, то он не поддерживает 'emplace' с более чем одним аргументом –

ответ

1

Вы используете старую версию Visual C++, который не правильно поддержки emplace. Возможно, Visual C++ 2010.

Как Visual C++ Team Blog однажды сказал:

В соответствии с требованиями C++ 11, мы реализовали устанавливать()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() во всех контейнерах для «произвольного» количества аргументов (см. ниже).

(...)

VC10 поддерживается заложения от 1 аргумента, который не был особенно полезным.

Лучшим решением было бы перейти на последнюю версию компилятора.

+0

О, получилось! Благодаря :) – user3543006

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.

Смежные вопросы