我具有以下功能模板,该功能模板可以获取任何类型的映射,并返回与某个键相关联的值或在呼叫站点提供的默认值:
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
对其进行了调用,但对于const char*
的第二个参数则将其作为get_or_default
进行了调用>
无论我传递字符串对象还是字符串文字,如何使此函数都能正常工作?
非常感谢您的帮助。
我有以下功能模板,可以使用任何类型的映射,并返回与某个键相关联的值或调用站点提供的默认值:template
由于对Key
模板参数的推论有冲突,您可以简单地将Key
参数之一设为非推论上下文。
首先提供一个简单的类型标识结构: