总结一下今天学到的容易出现二义性问题的地方
1、类在重载函数时容易出现二义性,当出现二义性时,编译器会调用最佳的匹配函数,当时如果找不到的话,就会出错,比如说我们重载了这样的函数:
void emp(int,int);
void emp(double,double );
然后有以下的调用:
int e1,e2;
double e3,e4;
emp(e1,e2);//OK
emp(e3,e4);//OK
emp(e3,e2);//error
以上的第一、二个是精确调用所以没问题,第三个调用,因为double型可以转换为int型,int也可以转换为double型,所以在调用时两个重载函数中找不到最佳的匹配函数,编译器不知道怎么转换,只有报错,
为了避免出现调用时的二义性,我们可以通过显式的强制类型转换指定调用类型,比如emp(static_cast<double>(e3),e2);
2、如果类既定义了转换操作符又定义了重载操作符,则容易产生二义性,比如有这样的一个类:
class emp
{
public:
emp(int i=0) :val(i){}
operator int() const{return val;}
friend emp operator+(const emp&,const emp&);
private:
size_t val;
};
有如下操作:emp e ; int i=e + 0;此时会出现二义性,因为0可以转换为emp类型,在使用重载的+进行相加,也可以将e转换为int型在进行相加,这两个操作间没有最佳选择,因而会出错。
类类型转换以后不能再跟另一个类类型进行转换。
原文:http://www.cnblogs.com/xinyuwuhen/p/3572455.html