C++转换二义性问题
在看C++primer讲转换的时候,讲二义性,我把他的例子哪来实现一遍发现一些问题求解答#include<iostream>
class Double;
class Int //这是两个类之间可以相互转换而引起的二义性问题
{
public:
friend class Double;
Int(Double c); //因为Double是前向声明,所以这个构造函数的定义在后面
Int(int a=1):num(a){}
int num;
};
class Double
{
public:
Double(double d=1.1):num(d){}
operator Int()const {return Int(num);}
double num;
};
Int::Int(Double c)
{
num=2;
}
void print(Int base)
{
std::cout<<base.num;
}
int main(void)
{
Double a(9.0);
print(a); //理应来说应该发生二义性问题,是用 Double的转换操作符把a转换为Int的对象,还是把a作为形参调用Int的构造函数来创建Int的对象
//但是却通过编译了 ,并且是选择了把a作为形参调用Int的构造函数来创建Int的对象why?
return 0;
} 后面的都是由第一个例子的改版
#include<iostream>
class Double;
class Int//这是两个类之间可以相互转换而引起的二义性问题
{
public:
friend class Double;
Int(Double c);
Int(int a=1):num(a){}
int num;
};
class Double
{
public:
Double(double d=1.1):num(d){}
operator Int() {return Int(num);} //较之前,删去了const限定符,这个时候print(a)函数通不过编译,错误提示是二义性why
double num;
};
Int::Int(Double c)
{
num=2;
}
void print(Int base)
{
std::cout<<base.num;
}
int main(void)
{
Double a(9.0);
print(a); //错误提示是二义性
return 0;
} #include<iostream>
class Double;
class Int //这是两个类之间可以相互转换而引起的二义性问题
{
public:
friend class Double;
Int(Double *c); //当传指针时,Double类的转换操作符有无const限定符都能通过编译 ,还是执行了调用Int的构造函数的方法
Int(int a=1):num(a){}
int num;
};
class Double
{
public:
Double(double d=1.1):num(d){}
operator Int(){return Int(num);}
double num;
};
Int::Int(Double *c)
{
#include<iostream>
class Double;
class Int //这是两个类之间可以相互转换而引起的二义性问题
{
public:
//friend class Double;
Int(Double& c); //当改成传引用时,若Double中的转换操作符没有const 则错误提示是二义性why
Int(int a=1):num(a){}
int num;
};
class Double
{
public:
Double(double d=1.1):num(d){}
operator Int() {return Int(num);} //删除了const
double num;
};
Int::Int(Double& c)
{
num=2;
}
void print(Int base)
{
std::cout<<base.num;
}
int main(void)
{
Double a(9.0);
print(a); //错误提示是二义性
return 0;
}
三楼的代码漏了 顶 求解答啊啊啊啊
页:
[1]