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