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

标签 c++ templates compiler-construction

我指定了一个模板函数:

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/

相关文章:

c++ - Visual Studio 2017 找不到 windows.h

c++ - Lambda 作为模板函数

java - 为什么在指示行上方的行没有编译错误?

C++使用wstring拆分unicode分隔的字符串

c++ - 如何在滚动区动态插入项目并在Qt中加载滚动条?

c++ - 包含在命名空间内

javascript - Ember 发布独特的 Assets 文件名以保证 CDN 新鲜度?

c++ - 特化一个函数模板

compiler-construction - 写语法扩展时,是否可以查询注解类型以外的类型信息?

assembly - 用于学生项目的小型汇编翻译器