防止将QObject *隐式转换为bool:防止“多个构造函数”警告

时间:2015-10-12 10:35:02

标签: c++

我遇到与问题How to prevent implicit conversion from char array to 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解决方案。

1 个答案:

答案 0 :(得分:1)

我假设私有构造函数的规范与你所描述的不同,因为它根本不会编译(第一个参数的默认值,而不是第二个参数的默认值)。

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

 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。如果要停止它,请将私有构造函数转换为模板。