2017-02-28 41 views
-5

爲什麼這兩個程序的輸出相同?使用模板(相同結果)

實施例1

template < typename T1, typename T2 > 
T1 sumit(T1 a, T2 b) 
{ 
    T2 result = (a + b); 
    return result; 
} 
int main() 
{ 
    cout << sumit(1, 'a'); 
} 

實施例2

template < typename T1, typename T2 > 
T1 sumit(T1 a, T2 b) 
{ 
    T1 result = (a + b); 
    return result; 
} 

int main() 
{ 
    cout << sumit(1, 'a'); 
} 

什麼是T1結果和T2之間結果順從?

+0

請花時間清理您的示例。呈現雜亂或奇怪格式的代碼(包括過多的空白或縮進)將使許多用戶離開。 –

回答

1

在任何一種情況下,您都將第一個參數作爲int傳遞,將第二個參數傳遞爲char。因此,T1變成int而T2變成char

在第一種情況下,您將a+b的結果存儲在char變量中(因爲T2這裏是一個char),但在返回結果時它變成了一個int。在您的代碼中,您只需添加1'a',並且「a」的ASCII值爲97.因此,返回的結果爲98. charint均返回相同的答案,因爲char也可以存儲98(char爲1個字節及其範圍是-128到127; int是4個字節)。

在您的第二個程序中,您將總和存儲在一個int變量中(因爲T1是int),它肯定可以存儲爲98(int值)的1+'a'的總和。

所以你在兩種情況下都會得到相同的結果。

如果你已經增加了一些大的int值而不是1這兩個程序的返回結果會有所不同。例如,如果您通過1200 and 'a'來發送()函數,則第一個程序將由於char範圍的溢出而返回17,但第二個程序將返回1297(在int情況下不會溢出)。

1

在第一種情況下,您正在創建一個T2項目,然後將它作爲T1項目(按照函數簽名)返回。在第二個程序中,您正在創建一個T1項目並將其作爲T1項目返回。在這兩種情況下,T1都被返回,而不是T2。

+1

@utsav_deep我從來沒有說過它們是等價的,只是都返回了T1值,在本例中它是一個int值。 – JGroven

+0

意識到這一點後刪除了我的評論。 –