我遇到与问题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解决方案。
答案 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
。如果要停止它,请将私有构造函数转换为模板。