使用 bool 和 const char 重载的 c++ 函数会在没有警告的情况下产生歧义 (MSVC2012)

c++ function overloading with bool and const char creates ambiguity without a warning (MSVC2012)

我有两个函数用于 return 值错误处理:

static void handleError(int error, const std::string& message, bool bShowAll = false);

static void handleError(int error, const std::string& prefix, const std::string& message, bool bShowAll = false)

我遇到问题的这个函数的调用如下所示:

handleError(errro, "moduleA", "query failed");

现在问题出现了,上面的调用导致调用第一个变体而不是第二个变体,其传递参数 bShowAll 解析为 "true"。我最好的猜测是 "const char[]" 与 "bool" 类型兼容。

我曾尝试更改函数的顺序(通过对第二个函数使用前向声明),但它根本没有帮助。 c++ 提供了哪些其他选项来解决这个问题? (所有类型转换都不起作用 - 使用 bool 以外的其他类型,例如带有枚举符号等价物的枚举类型,用于 bool 的设计目的进入良好的操作。我认为默认值参数 init 是项目这为此打开了大门,但 MSVC 2012 本身并没有暗示这种歧义,尽管我 运行 它的警告级别高达 #4。)

注意:我认为 stack-overflow 也是关于学习如何把事情做得漂亮、聪明以及向他人学习:对计算和计算机语言领域的事物是如何设计的有自己的理解。

问题是"query failed"const char[]类型,需要转换成std::string才能调用handleError。这是一个用户定义的转换,比标准转换(从 const char[]const char* 再到 bool)具有更差的等级。

您可以让它显式传递 std::string,以避免隐式的用户定义转换。

handleError(errro, std::string("moduleA"), std::string("query failed"));

或者从 C++14 开始

using namespace std::string_literals;
handleError(errro, "moduleA"s, "query failed"s);