2017-02-28 37 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

意识到这一点后删除了我的评论。 –