无论如何传递字符串文字还是字符串对象,我如何都能使此函数模板正常工作?

问题描述 投票:0回答:1

我具有以下功能模板,该功能模板可以获取任何类型的映射,并返回与某个键相关联的值或在呼叫站点提供的默认值:

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

c++ templates stdstring
1个回答
0
投票

由于对Key模板参数的推论有冲突,您可以简单地将Key参数之一设为非推论上下文。

首先提供一个简单的类型标识结构:

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.