首页 > 解决方案 > 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)

很明显,错误的函数签名被调用了,但我不知道它到底是如何得到那个布尔输入来选择错误的。任何人都知道为什么会发生这种情况?

标签: c++

解决方案


这是因为"code"const char[]衰减到的类型const char*

指针类型可隐式转换为bool(此处计算为true),同时std::string需要构造函数调用来构造第std::string一个。因此,bool重载受到青睐并因此被选中。

您可以通过先创建一个临时字符串来解决此问题:

output.Set<int>("/" + api_name, code, std::string("code"));

推荐阅读