我有这个api的头文件:
class XmlTree {
public:
template<typename T> void Set(const std::string& path, const T& val, const std::string& attrib = "") {...}
template<typename T> void Set(const std::string& path, const T& val, bool encrypt) {...}
}
代码正在执行以下行:
static XmlTree get_root_response(const string& api_name, int code = 0) {
XmlTree output;
//api_name is a const string&="Wut", code is an int=200
output.Set<int>("/" + api_name, code, "code"); //on this line
...
return output;
}
由于某种原因,它将调用第二个Set函数签名,而不是第一个。 GDB显示以下内容:
#1 XmlTree::Set<int> (this=address, path="/Wut", val=@address: 200, encrypt=true)
#2 get_root_response(api_name="Wut", code=200)
很明显,错误的函数签名被调用,但是我不知道到底是如何从布尔输入中选择错误的签名。有人知道为什么会发生这种情况吗?
答案 0 :(得分:6)
这是因为"code"
的类型为const char[]
,它会衰减为const char*
。
指针类型可隐式转换为bool
(此处的结果为true
),而std::string
需要构造函数调用才能首先构造std::string
。因此,bool
重载受到青睐,因此被选中。
您可以通过首先创建一个临时字符串来解决此问题:
output.Set<int>("/" + api_name, code, std::string("code"));
答案 1 :(得分:1)
如果您进行了调用,则评估布尔值的指针被认为比必须执行基于构造函数的转换更好:
output.Set<int>("/" + api_name, code, std::string("code"));
您将获得所需的过载。