练习14.52:
对于表达式:ld = si + ld
由于LongDouble不能相互转换为SamllInt,SmallInt也不能转换为LongDouble,可以将两个类型都转为算术类型,然后使用内置转换
候选函数为内置转换double->int,float->int,int->float,int>double以及LongDouble类的operator double(),operator float(),SmallInt类的operator int()const
可以使用double(float)转为int,然后两个int相加,也可以int转为double(float),两个double(float)相加,可以匹配的内置转换太多,产生二义性,无可行函数
对于表达式:ld = ld + si
同样,LongDouble不能相互转换为SamllInt,SmallInt也不能转换为LongDouble此处也可以使用内置转换后相加,但不是最佳匹配
候选函数为内置转换double->int,float->int,int->float,int>double以及LongDouble类的operator double(),operator float(),SmallInt类的operator int()const,非成员函数LongDouble operator+(LongDouble&,double)
最佳匹配为非成员函数LongDouble operator+(LongDouble&,double),左边为LongDouble类型的ld引用,右边为SmallInt转换为int再经内置转换为double
练习14.53:
可以使用SmallInt的友元函数SmallInt operator+(const SmallInt& ,const SmallInt&),将3.14转换为int,然后再将int转换为SmallInt,相加。也可以先将SmallInt转换为int,再使用内置类型将int转化为double,产生二义性
改正:double d = s1 + SmallInt(3.14);此时使用SmallInt的友元函数SmallInt operator+(const SmallInt& ,const SmallInt&)为最佳匹配