2010-09-16 48 views
6

與此類似的問題 C++ Function Overloading Similar Conversions 已被問及我瞭解問題的一般前提。尋找解決方案。2過載有類似的轉換

我有2個重載函數:

virtual IDataStoreNode* OpenNode(const char *Name, bool bCreateIfNotExist,int debug=0) { return 0; 
} 

virtual IDataStoreNode* OpenNode(const char* Name,int debug=0) const { return 0; } 

從錯誤這樣看來,布爾和INT不能用於區分功能過載。

問題是,有沒有辦法解決這個問題?

+0

我懷疑你的問題會自動消失,如果你擺脫邪惡的默認參數。 – 2010-09-16 02:09:25

+0

我需要閱讀更多有關邪惡默認參數的內容,但如果您正在更改界面,它們確實派上用場。 – Pradyot 2010-09-16 13:39:50

回答

10

boolint可以使用來區分功能過載。正如人們所預料的那樣,bool參數會偏好bool過載和int參數 - int過載。

通過錯誤信息判斷(我假設你的問題的標題是你得到的錯誤信息的一部分),你所處理的是當你提供的參數既不是bool也不是int,但轉換到boolint存在並且具有相同的等級。

例如,考慮這個

void foo(bool); 
void foo(int); 

int main() { 
    foo(0);  // OK 
    foo(false); // OK 
    foo(0u); // ERROR: ambiguous 
} 

前兩個電話將成功地解決和預期的方式。第三個調用不會解析,因爲參數類型實際上是unsigned int,但支持對boolint的隱式轉換,從而使調用不明確。

你是怎麼稱呼你的功能的?向我們展示您試圖通過的論點。

2

對於下列功能:

virtual IDataStoreNode* OpenNode(const char *Name, bool bCreateIfNotExist,int debug=0) { return 0; } 
virtual IDataStoreNode* OpenNode(const char* Name, int debug=0) const { return 0; } 

下面的調用(作爲一個例子,可能存在其它)將是不明確的:

unsigned int val = 0; //could be double, float 
OpenNode("", val); 

由於unsigned int可以轉換爲兩個boolint,有歧義。要解決這個問題最簡單的方法是將參數轉換爲參數的輸入您的首選超載:

OpenNode("", (bool)val); 

OR

OpenNode("", (int)val);