gpt4 book ai didi

C++ 模板函数 - 编译器错误 : 'can not change from from const char* to int'

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:40 24 4
gpt4 key购买 nike

我指定了一个模板函数:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com