总结一下今天学到的容易出现二义性问题的地方

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型在进行相加,这两个操作间没有最佳选择,因而会出错。

类类型转换以后不能再跟另一个类类型进行转换。