使用 std::map 时提供默认值的函数

a a*_*a a 2 c++ templates

我正在尝试编写一个函数,当键不在 std::map 内时,它将给我一个默认值。在所有情况下,我的默认值都是 numeric_limit::infinity()。\n但是这个简单的示例不起作用。

\n
#include <iostream>\n#include <map>\n#include <limits>\n\ntemplate<typename KeyType, typename ValueType>\nValueType mapDefaultInf(const std::map<KeyType, ValueType> & map, const KeyType & key)\n{\n    if(!map.contains(key))\n    {\n        return std::numeric_limits<ValueType>::infinity();\n    }\n    else\n    {\n        return map[key];\n    }\n}\n\nint main()\n{\n    std::map<std::string, int> map;\n    auto el = mapDefaultInf(map, "alexey");\n    std::cout << el << std::endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

错误是:

\n
main.cpp:29:42: error: no matching function for call to \xe2\x80\x98mapDefaultInf(std::map, int>&, const char [7])\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

有人可以帮我理解这个错误吗?

\n

提前致谢。

\n

Qui*_*mby 5

您对模板的限制太多,因为它要求映射中的键与参数的类型相同key

这会失败,因为您的地图存储std::string但您传递了一个字符串文字,从技术上讲,该字符串文字的类型为const char[7].

只需制作标题:

template<typename KeyType, typename ValueType,typename T>
ValueType mapDefaultInf(const std::map<KeyType, ValueType> & map, const T& key)
Run Code Online (Sandbox Code Playgroud)

它将允许在调用时进行隐式转换map.contains(key),如果您向其传递不兼容的类型,它将失败并显示更复杂的错误消息。无论如何,当前的错误并不是可读性的顶峰。