使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
c++ function overloading with bool and const char creates ambiguity without a warning (MSVC2012)
我有两个用于返回值错误处理的函数:
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);
相关文章:
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 为什么仅在列表初始化的情况下才会出现狭窄的转换警告
- g++ 在不使用 -Wconvert 的情况下将 double/float 转换为无符号整数时发出警告
- 如何在没有编译器警告的情况下返回对空字符串的 const 引用?
- Ogre 如何在没有 C4251 警告的情况下在导出类中使用 STL 容器
- OpenCV cv::VideoWriter 在没有警告的情况下停止写入
- 服务器端警告:聚合查询在没有分区键的情况下使用
- 在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?
- 如何删除关于负偏移的警告,这些警告在正确的流分支的情况下永远不会发生
- 在pylint中,有一种方法可以在本地禁用警告,然后在不显式给出列表的情况下撤消之前的抑制
- 在没有警告(或编译指示)的情况下进行便携式"assign within conditional expressions"的好方法?
- 在没有警告提示的情况下打开文件
- 为什么VS2008在没有警告的情况下编译时使用了错误的模板逻辑
- 警告C4309 -它是什么意思,在这种情况下可以忽略它
- 为什么系统在没有警告的情况下接受作为int参数传递的long int
- c++模板和const(使用auto在没有编译器警告的情况下发生冲突)
- 为什么这段代码在没有警告的情况下编译
- 我可以在不中断代码的情况下删除此警告吗?
- 在使用/Wp64进行编译时,如何在不发出警告的情况下将strlen的结果转换为int