二义性问题之重载函数和转换构造函数

所谓二义性呢,就是出现了多个能够匹配的方式,导致编译器无法判断选择哪一个,出现的错误。

#include "pch.h"
#include 
class first {
public:
	  first(int a):
		number(a){}
private:
	int number;
};
class second {
public:
	second(int a):
		number(a){}
private:
	int number;
};
void xiaoming(const first& a) {
	std::cout << "this is first class" << std::endl;
}
void xiaoming(const second& a) {
	std::cout << "this is second class" << std::endl;
}
int main()
{
	
	xiaoming(2);
}

在上面的简短程序中,就出现了二义性问题。

全局函数xiaoming的重载可以接受两个类类型的对象。

同时,这两个对象的构造函数,都有接受int类型。

因此当出现,xiaming(2);这种情况时,编译器不知道是将2转换到first类型的对象还是second类的对象,导致发生了错误。

我自己总结的解决方法:

/*这种情况下,就会发生二义性,导致xiaoming的两个重载的函数都能够匹配2这个参数,所以呢,会报错误*/
    /*解决办法:说实话,这种情况确实有几率会碰到并且难以查找,怎么办,记得当时看到explicit是说到,我们通常不希望普通类型转换成类类型,所以呢,
    我们给构造函数加上explicit,让他不能够进行转换,所以呢上面这种情况也就可以避免了。这是我认为最好的办法。

    当然如果需要这种类型转换的话,可以将重载函数中想转换的那个写为非explicit,其他的全部都是explicit,让编译器只能匹配到一个函数即可
    不够我强烈不建议,当编写大程序的时候,容易忽略问题,导致出现难以排查的问题。

例如,上面的程序中,我们可以给其中一个类的构造函数添加explict   

   explicit first (int a) 

 这样也是可以的*/

你可能感兴趣的:(C++)