2011-08-29 87 views
1

我有一個名爲FileProc的類,它運行File IO操作。在一種情況下我已經聲明兩個函數(這是子功能,運營商=功能),都果斷地不同:C++歧義過載問題

const bool WriteAmount(const std::string &Arr, const long S) 
{ 
    /* Do some string conversion */ 
    return true; 
} 

const bool WriteAmount(const char Arr[], unsigned int S) 
{ 
    /* Do some string conversion */ 
    return true; 
} 

如果我做一個「字符的字符串」來WriteAmount呼叫時,報告多義性錯誤 - 說它在char字符串的WriteAmount和std :: string的WriteAmount之間混淆。我知道底下發生了什麼 - 它試圖使用std :: string構造函數將char字符串隱式轉換爲std :: string。但我不希望這發生在WriteAmount(IE我不希望在函數內發生任何隱式轉換 - 給定每個角色針對每個角色進行優化)的情況下發生。

我的問題是,爲了保持一致性,不改變函數格式(IE不改變參數的數量或它們出現的順序),而且不改變標準庫,是否有防止相關函數中的隱式轉換?

我忘了添加,最好不要使用類型轉換,因爲這對函數調用來說是單調乏味的,而不是用戶友好的。

+0

所以你想改變一些東西而不改變任何東西?你如何看待它的可能性? – Dani

回答

5

由於你的第二個參數不同,你會得到不明確的地方。試圖用long x = ...; WriteAmount("foo", x)調用它會引起歧義,因爲它與第一個重載更好地匹配第二個參數,但第一個參數與第二個重載更好地匹配。

在這兩種情況下使第二個參數具有相同的類型,您將擺脫歧義,因爲第二個參數匹配對於兩個重載都同樣差/好,並且第一個參數會更好地匹配第二個參數超載。

+0

這似乎是原因。目前我只是通過代碼來做必要的修改來檢查。 – SSight3

0

難道你不能改變第二個參數並將其轉換爲unsigned int嗎?它不應該能夠使用第一個函數調用。我沒有用C++編碼了很長時間..