繁体   English   中英

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

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

我有与问题相同的问题, 如何防止从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 如果要停止此操作,请将私有构造函数转换为模板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM