[英]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.