c++ - 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)
很明显,错误的函数签名被调用了,但我不知道它到底是如何得到那个布尔输入来选择错误的。任何人都知道为什么会发生这种情况?
解决方案
这是因为"code"
是const char[]
衰减到的类型const char*
。
指针类型可隐式转换为bool
(此处计算为true
),同时std::string
需要构造函数调用来构造第std::string
一个。因此,bool
重载受到青睐并因此被选中。
您可以通过先创建一个临时字符串来解决此问题:
output.Set<int>("/" + api_name, code, std::string("code"));
推荐阅读
- c++ - (C++)试图用给定范围内的随机数填充数组,一遍又一遍地填充相同的数字
- java - Android:如何在非Activity测试类中获取资源?
- bash - 如何在`su $user <中`cat <<'EOF'`
##!/bin/bash set -e backup_dir='/home/my/backup' user='my' su $user <<EOFHD cat << 'EOF' > $backup_dir/autorestartnftables.sh #!/bin/bash SERVICENAME="nftables"
- android-studio - Frames调试中的thread、main和pool有什么区别?
- java - 如何从 ArrayList 中删除对象
? - class - 从 SwiftUi 视图中通过 SpriteView GameScene 传递/共享类
- powershell - Cmdlet 不尊重 -ErrorAction 标志或在运行时正确继续
- excel - 带有按钮的重复工作表
- java - 如何在 Flutter 中更改 Java 二进制文件的文件夹
- javascript - 无法将数据保存到 MongoDB Compass