C ++调用错误签名的函数

时间:2018-07-08 17:52:23

标签: c++

我有这个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)

很明显,错误的函数签名被调用,但是我不知道到底是如何从布尔输入中选择错误的签名。有人知道为什么会发生这种情况吗?

2 个答案:

答案 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"));

您将获得所需的过载。