2011-04-12 74 views
2

有人能告訴我在以下兩種情況下編譯器有什麼不同嗎?返回類型的重載函數? (重新訪問)

#include <cstdio> 
    using namespace std; 

    template <typename TReturn, typename T> 
    TReturn convert(T x) 
    { 
     return x; 
    } 

    int main() 
    { 

     printf("Convert : %d %c\n", convert<int, double>(19.23), convert<char, double>(100)); 
     return 0; 
    } 

int convert(double x) 
{ 
    return 100; 
} 

char convert(double x) 
{ 
    return 'x'; 
}   

int main() 
{ 
    printf("Convert : %d %c\n", convert(19.23), convert(100));  // this doesn't compile 
    return 0; 
} 

是否第一種情況下沒有函數重載?

+8

你的第二種情況無效。它編譯的唯一原因是因爲你鍵入'covert',而不是'convert'。你不能聲明具有唯一的返回類型是不同的兩個名稱相同的功能。 – 2011-04-12 20:50:43

回答

7

當編譯器遇到這個呼叫到一個模板函數,它使用模板自動生成功能通過替換作爲實際模板參數(雙在這種情況下)通過了類型的每個外觀,然後調用它。該過程由編譯器自動執行,對程序員不可見。因此它也實現了數據抽象和隱藏。

編譯器不把模板作爲正常功能或類。它們根據需求進行編譯,這意味着模板函數的代碼在需要時纔會被編譯。

第二個exmaple沒有超載。你拼錯了轉換。

相關問題