我指定了一个模板函数:
template<class T> void jsonParse(json_object* jobj, eParseWhat parseWhat, T &value) {
...
if(parseWhat == PARSE_UID) {
value = json_object_getInt(val);
}
if(parseWhar == PARSE_EMAIL) {
value = json_object_getString(val);
}
...
}
现在,当我想解析 json 对象的 uid
时,我使用 int
调用该方法:
json_object* obj = ...;
int uid = 0;
jsonParse(obj,PARSE_UID,uid);
但是随后在行的赋值处发生了编译错误:
value = json_object_getString(val);
由于使用 int
进行调用,编译器认为变量 value
的类型是 int
并且 json_object_getString(val )
返回 const char*
。所以编译器说:
无法从 const char* 转换为 int
。
你对解决这个问题有什么建议吗?
最佳答案
如果要为每种类型执行一堆 if 语句的 switch 语句,为什么还要使用模板?如果您想将每种类型都视为多种类型,那么您的模板实例化将永远不会编译。这种设计是有缺陷的,但如果你必须这样做,那么你可以使用特化来完成类似的事情。
template<class T> void jsonParse(json_object* jobj, eParseWhat parseWhat, T &value) {
static_assert(false); // not a handled type
}
template<> void jsonParse(json_object* jobj, eParseWhat parseWhat, int &value) {
value = json_object_getInt(val);
}
template<> void jsonParse(json_object* jobj, eParseWhat parseWhat, std::string &value) {
value = json_object_getString(val);
}
正如 GMan 指出的那样,重载函数通常比特化函数模板更可取。使用重载函数的等价物是这样的:
void jsonParse(json_object* jobj, eParseWhat parseWhat, int &value) {
value = json_object_getInt(val);
}
void jsonParse(json_object* jobj, eParseWhat parseWhat, std::string &value) {
value = json_object_getString(val);
}
关于C++ 模板函数 - 编译器错误 : 'can not change from from const char* to int' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301221/