代码之家  ›  专栏  ›  技术社区  ›  Alexander Stohr

使用BoL和conchar的C++函数重载创建无警告的歧义(MSVC2012)

  •  2
  • Alexander Stohr  · 技术社区  · 6 年前

    我有两个返回值错误处理功能:

    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”类型兼容。

    我尝试过改变函数的顺序(使用第二个函数的forward声明),但这一点都没有帮助。C++还提供了其他解决方案吗?(在所有类型转换都不起作用-使用bool以外的其他类型,例如,一个枚举类型,其枚举符号等效于bool设计用于的类型,从而实现了良好的操作。我认为默认值参数init是为此打开大门的项,但MSVC 2012本身并没有提示这种模糊性,尽管我正在运行它,警告级别高达4。)

    注意:我认为栈溢出是关于学习如何做好事、聪明的事情,也是为了向他人学习:了解如何在计算和计算机语言领域设计事物。

    1 回复  |  直到 6 年前
        1
  •  3
  •   songyuanyao    6 年前

    问题是 "query failed" 属于类型 const char[] ,需要转换为 std::string 对于 handleError 被召唤。这是用户定义的转换,其等级比标准转换(从 常量字符[] const char* 并且 bool )

    你可以让它通过 STD::字符串 显式地,以避免隐式的用户定义转换。

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

    或者因为C++ 14

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