2016-09-12 62 views
-1

這個正確的方式我有這樣的代碼:是修復曖昧函數調用

#include <cstdio> 

void test(size_t const pos){ 
    printf("size_t\n"); 
} 

void test(const void *ptr){ 
    printf("ptr\n"); 
} 

//void test(int const pos){ 
// printf("int\n"); 
//} 

int main(){ 
    size_t x = 0; 

    test(x); 
    test(nullptr); 
    test(&x); 
// test(0); 
// some more that fail, but I do not care too much about them: 
// test(0U); 
// test(0L); 
// test(NULL); 
} 

當我取消註釋test(0);它不會編譯,因爲編譯器不知道如何將「0」。

如果我引入'int'重載,所有事情都會再次編譯。

這是避免模糊函數調用的正確方法嗎?

UPDATE

正確就意味着 - 我要不要打電話指針過載,除了在案件的說法是指針或nullptr傳遞。

我知道,目前的「設置」失敗,0U,0L,NULL

+1

的可能的複製[我如何修復的「曖昧」的函數調用?] (http://stackoverflow.com/questions/7549874/how-doi-i-fix-an-ambiguous-function-call) – Jezor

+1

那麼......這取決於你期待什麼結果。 – Jezor

+0

那麼,因爲這解決了編譯錯誤,我不知道任何更好的「正確」的定義。 –

回答

4

字面值0的類型爲int。如果有一個test(int)過載,那麼將會調用它,因爲不需要轉換。簡單。

如果沒有test(int)可用,則編譯器將查看參數是否可以轉換爲size_tvoid*以滿足其他重載。字面0可以隱式轉換爲任一種類型,並且轉換規則不會讓它偏好任何一種,所以結果不明確。

爲了指定要test(size_t)叫,你需要明確創建size_t類型的0,即

test(size_t{0}); 
+3

'int'不能隱式轉換爲void *'。 '0'是特別的。 – Barry

+0

@巴里很好,謝謝。編輯。 –

+0

@Barry正是我想要的 – Nick