二义性:这么干也行,那么干也行,导致编译器不知道怎么干,所以这种情况下编译器只能报错。
例一:
class test
{
public:
operator int() const//类型转换运算符
{
}
operator double() const
{
}
};
int main()
{
test obj;
int a = obj + 10;//虽然这里a是整型,但是由于对象obj里含有两个类型转换运算符,它不知道要转int,还是double了,所以最终导致程序报错
}
例二:
class T1
{
public:
T1(int a)
{
}
};
class T2
{
public:
T2(int a)
{
}
};
void fun(const T1& ){}
void fun(const T2&) {}
int main()
{
fun(10);//由于重载的fun函数形参的两个类型当中,都有类型转换构造函数,所以编译器不知道要调用T1还是T2了(要把10转成一个类对象),所以最终导致编译器报错。
}