簡體   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