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

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

本文关键字:情况下 警告 MSVC2012 歧义 const bool char 重载 函数 C++ 使用      更新时间:2023-10-16

我有两个用于返回值错误处理的函数:

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 的设计进入了很好的操作。 我认为默认值参数 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);
相关文章: