3
回答
(新手)C++中的二义性问题
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

请教各位前辈二个二义性的问题,在网上找了一些资料,可是还是没有明白,所以来此请教各位前辈,问题为代码中的注释。

#include <iostream>
#include <string>

using namespace std;

class A{
private:
	char name[5];
public:
	A(int a){

	}
};
void f(A a , A b){
	cout << "A" << endl;
}

void f(A& a , A& b){
	cout << "B" << endl;
}
int main(void){
	A a(1);
	A b(2);
	//f(a,b);		这一行会出现编译错误。
	f(a ,3);		//为什么这样写就不会出现错误
	return 0;
}



#include <iostream>
#include <string>

using namespace std;

void max(float a , float b){

}

void max(int a , int b){
	
}

void max(char a , char b){
	
}

void max(int a , float b){
	
}


int main(void){
	max(50,82.3); //为什么会出现编译问题
	return 0;
}



<无标签>
举报
smalldream
发帖于3年前 3回/222阅
共有3个答案 最后回答: 3年前

第一个,3这玩意是字面量,不会有引用,所以编译器知道是用第1个f

第二个,我觉得不应该有问题的,要解释的话,第1个max和第4个max都是可以用的,所以编译器不知道要用哪个

试了一下, 第二个, g++报错信息是:error: call of overloaded ‘max(int, double)’ is ambiguous 

它把82.3当做了double, 

你改成 max(50, 82.3f) 就好了.

第一,参数中传引用还是传对象写法一样,确实有歧义,这是写法问题。你传个3,编译器会自动调用类的构造函数生成一个临时对象,临时对象是不能 A &a这样传引用的,所以没有歧义。

第二,编译器说得很明白:

 g++ -o t test.cpp 

test.cpp: In function ‘int main()’:
test.cpp:24: 错误:调用重载的‘max(int, double)’有歧义
test.cpp:6: 附注:备选为: void max(float, float)
test.cpp:10: 附注:         void max(int, int)
test.cpp:14: 附注:         void max(char, char)
test.cpp:18: 附注:         void max(int, float)
编译把82.3识别为double,但你的函数没并有重载double的,于是编译器开始尝试强制转换,发现可能转换到多个函数上。如果你这样写max(50,(float)82.3)就不会有问题

--- 共有 2 条评论 ---
changnet编译器的转换是向上不向下的,向下不安全。向下要程序员自己强制转换 3年前 回复
smalldream谢谢!对于第二个,max(50,82.3)中的50应该直接匹配10,18的max吧,82.3的字面浮点值为double,为什么不直接匹配18行的max,这样82.3只用向下转换一次,相比于其它的是最优的吧。 3年前 回复
顶部