【发布时间】:2020-08-03 09:51:10
【问题描述】:
我有以下函数模板,它接受任何类型的映射并返回与某个键关联的值或调用站点提供的默认值:
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;
}
当我这样调用函数时:
// 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
我认为参数Key 是模棱两可的,因为它是在地图模板中使用std::string 调用的,但get_or_default 的第二个参数是const char*
无论我传递的是字符串对象还是字符串文字,如何才能让这个函数工作?
非常感谢您的帮助。
【问题讨论】: