2013-11-28 37 views
2

我有2個功能,如下圖所示明確的函數調用引發錯誤?這是超載有效

void GetValue(unsigned int){} 
void GetValue(unsigned long){} 

如果我撥打電話的GetValue(4294967296)我獲取以下錯誤「模糊函數調用」。 既然int和long的大小都是4字節,這個重載是否會起作用?

+2

UMM,無,如果您收到錯誤消息。 – user1810087

+2

您如何期待編譯器知道要調用哪一個?你的常量既不是'unsigned int'也不是'unsigned long',所以它們都匹配得很好(或者同樣嚴重)。 –

回答

2
  1. 超載是有效的,但在這裏,你必須在這兩種情況下,從符號值一個類型轉換爲無符號。因此編譯器不能在兩者之間選擇。因此你的程序不能編譯。

  2. 除非您使用顯式類型鑄造GetValue((unsigned int)4294967696);,否則無法讓他選擇sizeof(int)= sizeof(long)= 4個字節的32位系統。文字規範是同爲intlong類型uUhttp://en.cppreference.com/w/cpp/language/integer_literal

  3. 但是你可以讓編譯器選擇,如果你有int和長(可在64位系統的情況下)的大小不同。在這種情況下,編譯器根據變量的範圍選擇。

    所以,你可以把它編譯,如果你給一個無符號的文字:

    GetValue(4294967696u); 
    

    4294967296超出範圍爲int,它是0..4,294,967,295 4字節長的無符號整型。並且在8字節長的無符號long範圍內。 (見http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.90).aspx)因此,程序將調用長功能。

    #include <iostream> 
    using namespace std; 
    
    void GetValue(unsigned int x){cout << "int " << x << endl;} 
    void GetValue(unsigned long x){cout << "long " << x << endl;} 
    
    int main() { 
        GetValue(4294967295u); 
        GetValue(4294967696u); 
        GetValue(static_cast<unsigned int>(4294967696)); 
    
        cout << sizeof(unsigned int) << " " << sizeof(unsigned long) << endl; 
    } 
    

    與用gcc輸出在64位系統:

該程序並根據該文字範圍內編譯並選擇不同的功能

int 4294967295 
long 4294967696 
int 400 
4 8 
+2

爲什麼第三個'400'? –

+0

@ColeJohnson,因爲4294967696超出了無符號整型(即0..4,294,967,295)的範圍,所以它在類型轉換時被截斷。 – klm123

+0

噢。我的錯。 –

2

只是您的通話類型,例如。的GetValue((unsigned int類型)4294967296)

相關問題