У меня есть следующий шаблон функции, который принимает любой тип карты и возвращает либо значение, связанное с определенным ключом, либо значение по умолчанию, предоставленное на сайте вызова:
template <template <typename Key, typename Val, typename ...Args> typename C, typename Key, typename Val, typename ...Args>
Val get_or_default(C<Key, Val, Args...> const& my_map, Key const& k, Val const& v)
{
typename C<Key, Val, Args...>::const_iterator const it = my_map.find(k);
return (it != my_map.end()) ? it->second : v;
}
, когда я вызываю функцию this путь:
// initialize map
std::map<std::string, int> m1{ {"jim",1},{"mark",2},{"sally",3} };
// call get_or_default with std::string as key arg
std::cout << get_or_default(m1, std::string("jim"), -1) << std::endl;
все работает как положено, однако, когда я вызываю такую функцию, как:
std::cout << get_or_default(m1, "jim", -1) << std::endl;
, я получаю следующее сообщение об ошибке:
error C2782: 'Val get_or_default(const C<Key,Val,Args...> &,const Key &,const Val &)': template parameter 'Key' is ambiguous
I думаю, что параметр Key
является неоднозначным, потому что он вызывается с std::string
в шаблоне карты, но как const char*
для второго параметра get_or_default
Как я могу заставить эту функцию работать независимо передаю ли я строковый объект или строковый литерал?
Спасибо за любую помощь.