Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取具有默认值的地图元素的模板_C++_Map - Fatal编程技术网

C++ 获取具有默认值的地图元素的模板

C++ 获取具有默认值的地图元素的模板,c++,map,C++,Map,问题: 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

问题:

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
}
我试图创建一个函数
getmap
,该函数获取
map
元素,但如果不存在,则返回指定的默认值(即
getmap(mymap,“keyA”,mydefault);

我将其模板化为
int、float
char*
返回类型,但我得到一个错误:

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
}
模板内联
T getmap(const std::map&m,const char*键,const T def,T(*f)(const char*)=NULL){
std::map::const_迭代器i=m.find(std::string(key));
返回i==m.end()?def:(f==NULL?i->second.c_str():f(i->second.c_str());
}
内联int getmap(const std::map&m、const char*键、const int def){
返回getmap(m、key、def和std::atoi);
}
浮动atofl(常量字符*s){
返回(浮动)标准::atof(s);
}
内联浮点getmap(常量std::map&m、常量char*键、常量float def){
返回getmap(m、key、def和atofl);
}
内联字符*getmap(常量std::map&m,常量字符*键,常量字符*定义){
返回getmap(m,key,def);//此处出错
}
getmap(m,key,def);

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

然后,正如错误所说,您正试图将一个
常量char*
传递给一个
char*const
。您可以将一个非常量传递给一个常量,但不能反过来

所以写下这个

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

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

然后,正如错误所说,您正试图将一个
常量char*
传递给一个
char*const
。您可以将一个非常量传递给一个常量,但不能反过来

所以写下这个

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

为什么要将常量char*传递给一个需要指向函数指针的函数?为什么要使用
char*
呢?@user814628-你指的是哪里?Thanks@AlexanderTobiasHeinrich-映射是
,但我只希望能够执行类似
getmap(mymap,“keyA”,mydefault)的操作;
无需执行
std::string(“keyA”)
首先。@MiloChen Nevermind,准备好了就错了。你为什么要把常量char*传递给一个需要指向函数指针的函数?你为什么要使用
char*
呢?@user814628-你指的是哪里?Thanks@AlexanderTobiasHeinrich-地图是
,但我只想做一些类似
getma的事情p(mymap,“keyA”,mydefault);
无需先执行
std::string(“keyA”)
。@MiloChen无需担心,准备好了就错了。只需将参数和T设置为
const char*const
?只需将参数和T设置为
const char*const