防止将 QObject* 隐式转换为布尔值:防止'Multiple constructor'警告

Prevent implicit conversion of QObject* to bool : prevent 'Multiple constructor' warning

本文关键字:防止 警告 constructor 布尔值 Multiple QObject 转换      更新时间:2023-10-16

我有同样的问题如何防止从char数组隐式转换为bool

我有一个这样的构造函数:
public:
Foo(Goo a=0, bool b=true, QObject* parent = 0);

我想阻止调用

Foo(aGoo, aParent);

,其中aParent隐式转换为bool。(或任何其他指针)

我通过定义 实现了这一点
private:
Foo(Goo a, QObject* parent) {}

这会引发一个"多重构造函数"警告,我认为这是无害的,因为编译器将能够消除歧义。尽管如此,我还是想去掉这个警告。是否有不加警告的方法来防止隐式转换或抑制该警告?

编辑:欢迎c++ 11解决方案

我认为该私有构造函数的规范不像您描述的那样,因为它根本不会编译(第一个参数的默认值,但第二个参数不是)。

无论如何,显而易见的解决方案是不使用默认值,而提供一组形式的构造函数。

 public:
     Foo();
     Foo(Goo);
     Foo(Goo, bool);
     Foo(Goo, bool, QObject *);
 private:
     Foo(Goo, QObject*);   // leave this undefined.

这将触发任何试图调用私有构造函数的非成员或非友元的编译错误。对于成员和好友,结果将是链接错误。

在c++ 11中,您可以使用委托构造函数来减少代码重复。在c++ 11之前,使用由构造函数调用的通用帮助函数。

以上内容不会阻止编译器接受像

这样的内容
 Foo afoo(AGoo, (double *)0);
但是

,因为几乎任何指针都可以隐式转换为bool。如果你不想这样做,就把私有构造函数变成一个模板。