如何正确重载接受Json::Value与std::string的Response::make方法?
问题分析与解决
为什么会出现编译错误?
你遇到的是重载决议歧义问题。当传入字符串字面量(比如"xxx",类型是const char[N])时,编译器发现两个重载都能匹配:
std::string有接受const char*的隐式构造函数,可将const char[]转成std::string;- Json::Value同样提供了接受
const char*的隐式构造函数,因此也能把字符串字面量转成Json::Value。
编译器无法判断你想调用哪个重载,于是抛出错误。并不是Json::Value被当作字符串处理,而是两者的隐式转换路径都合法,导致歧义。
解决方法
1. 显式转换调用参数
调用时手动指定参数类型,消除歧义:
// 明确转成std::string Response::make(std::string("your response content")); // 或者明确转成Json::Value Response::make(Json::Value("your json content"));
2. 新增const char*类型的重载
专门添加一个接受const char*的重载函数,在内部转发到合适的版本:
Response Response::make(const char* body) { // 根据需求选择转发到std::string或Json::Value版本 return make(std::string(body)); }
这样编译器会优先匹配精确匹配的const char*重载,避免歧义。
3. 禁用Json::Value的隐式构造(如果可行)
如果Json::Value的构造函数由你维护,或使用的jsoncpp版本允许,可以给接受const char*的构造函数加上explicit关键字:
class Value { public: explicit Value(const char* str); // ...其他构造函数 };
这样就不会发生从const char*到Json::Value的隐式转换,编译器会优先选择std::string的重载。但如果是使用第三方库的Json::Value,此方法无法实现。
内容的提问来源于stack exchange,提问作者Emmanuel Amodu
相关产品推荐
相关产品推荐

