使用 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);
我有两个函数用于 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);