2017-06-25 17 views
1

在下面的測試程序中,使用bool謂詞調用checkit方法而不是調用整數過載。爲什麼?C++ bool表達式作爲函數參數調用錯誤的過載

(i == 10)應該創建一個布爾值,然後應該觸發bool重載被調用,否?

程序輸出

should be int 
    I'm a bool 1 
should be bool 
    I'm a bool 1 
should also be bool 
    I'm a int 1 

來源

class Overload 
{ 
public: 
    void checkIt(bool n) { printf(" I'm a bool %d\n", n); } 
    void checkit(long n) { printf(" I'm a long %ld\n", n); } 
    void checkit(int n) { printf(" I'm a int %d\n", n); } 
}; 

int main(int argc, char *argv[]) 
{ 
    Overload obj; 

    int i = 10; 
    bool b = true; 

    printf("should be int\n"); 
    obj.checkIt(i); 

    printf("should be bool\n"); 
    obj.checkIt(b); 

    printf("should also be bool\n"); 
    obj.checkit((i == 10)); 
} 

編輯

咄!對於錯字感到抱歉。

但是,在修正打字錯誤和註釋bool方法後,int方法使用bool謂詞調用。如果沒有找到更合適的簽名,是否存在從bool到int的默認轉換?嚴格地說,沒有bool簽名,所以我期待無論是編譯或運行時錯誤...

更新的代碼

class Overload 
{ 
public: 
    //void checkIt(bool n) { printf(" I'm a bool %d\n", n); } 
    void checkIt(long n) { printf(" I'm a long %ld\n", n); } 
    void checkIt(int n) { printf(" I'm a int %d\n", n); } 
}; 

int main(int argc, char *argv[]) 
{ 
    Overload obj; 

    int i = 10; 
    bool b = true; 

    printf("should be int\n"); 
    obj.checkIt(i); 

    printf("should be bool\n"); 
    obj.checkIt(b); 

    printf("should also be bool\n"); 
    obj.checkIt((i == 10)); 
} 

更新的輸出

should be int 
    I'm a int 10 
should be bool 
    I'm a int 1 
should also be bool 
    I'm a int 1 
+0

您只有一個名爲'checkIt'的函數的重載,所以這是唯一可以調用的函數。有兩個與名稱不同的函數無關的重載「checkit」。 –

+0

看起來像一個錯字。將所有'checkit'改爲'checkIt'會得到預期的結果。 – InternetAussie

+1

是的,有一個從'bool'到'int'的標準轉換。 – AnT

回答

4

checkIt ISN」超載;只有一個bool版本。

checkit過載;有一個long和一個int版本。

您的代碼請撥打checkIt兩次,checkit一次。

+0

反過來:一個'checkIt',兩個'checkit' –

+0

@IgorTandetnik編輯。 – melpomene

+0

謝謝melphomene,你救了我的睡眠,我以爲它會瘋了:-) – Serge

0

請記住,C++中的函數名稱(以及其他幾乎所有內容)都是CaSeSeIsItIvE。
在您更新的代碼中,有2個checkIt方法,一個用於int類型,另一個用於long類型。您調用checkIt 3次,最後2次您傳遞給方法a bool的值。在C++中bool值自動轉換到inttrue == 1false == 0

​​

由於沒有方法接受「布爾」類型,則該值自動轉換到int並調用int方法。

0

是的C++使用隱式conversion.bool,char會自動轉換爲int/short/long,反之亦然。

相關問題