用于获取具有默认值的地图元素的模板

时间:2013-05-15 15:26:43

标签: c++ map

问题:

我正在尝试创建一个获得getmap元素的函数map<string, string>,但如果不存在,则返回指定的默认值(即getmap(mymap, "keyA", mydefault);

我为int, floatchar*返回类型模板化但我收到错误:

error C2664: 'getmap' : cannot convert parameter 3 from 'const char *' to 'char *const '

即使我没有使用char *const。为什么会这样?

代码:

template <typename T> inline
T getmap(const std::map<std::string, std::string> &m, const char* key, const T def, T (*f)(const char*) = NULL) {
    std::map<std::string, std::string>::const_iterator i = m.find(std::string(key));
    return i == m.end() ? def : (f == NULL ? i->second.c_str() : f(i->second.c_str()));
}

inline int getmap(const std::map<std::string, std::string> &m, const char* key, const int def) {
    return getmap<int>(m, key, def, &std::atoi);
}

float atofl(const char* s) {
    return (float)std::atof(s);
}

inline float getmap(const std::map<std::string, std::string> &m, const char* key, const float def) {
    return getmap<float>(m, key, def, &atofl);
}

inline char* getmap(const std::map<std::string, std::string> &m, const char* key, const char* def) {
    return getmap<char*>(m, key, def);  // ERROR HERE
}

1 个答案:

答案 0 :(得分:3)

getmap<char*>(m, key, def);

使T getmap成为char*。您接受的第三个参数是const T。我知道看起来应该是const char*,但实际上它是char* const

您正尝试将const char*传递给char* const,如错误所示。你可以将非const传递给const,但不能反过来。

所以写下来......

getmap<const char*>(m, key, def);
       ^^^^^