所以我有这个作业要做“使用函数重载定义 3 个具有相同名称但具有不同 prams 类型(int、int*、int&)的函数,它们将返回值的平方根。”好吧,我做到了,但我不知道它给了我这个错误:“对重载函数的模糊调用”。我尝试修复它但没有成功...... 这是我的代码,它非常简单:
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <iostream>
using namespace std;
double rad(int);
double rad(int*);
double rad(int&);
int main(){
int a,*pt=&a;
cin>>a;
cout<<"Radical din "<<a<<" este "<<rad(a)<<endl;
cout<<"Radical din "<<a<<" este "<<rad(pt)<<endl;
cout<<"Radical din "<<a<<" este "<<rad(&a)<<endl;
return 0;
}
double rad(int x){
return (sqrt(x));
}
double rad(int *x){
return (sqrt(*x));
}
double rad(int &x){
return (sqrt(x));
}
最佳答案
鉴于这些声明:
double rad(int); // (1)
double rad(int*); // (2)
double rad(int&); // (3)
处理 (2)
很简单。我们要么有指针,要么没有,不可能混淆。那么问题是,发生了什么:
int a;
rad(a);
好吧,这里 (1)
和 (3)
都有效。实际上,在确定最佳可行候选人的规则中,两者之间没有任何偏好!这是一个不明确的调用,所以它总是无法编译。
请注意,虽然 可以显式调用 (1)
- 只需传入一个 int
就可以了引用:
rad(4); // calls (1), since neither (2) nor (3) are possible
另请注意,即使使用像 a
这样的命名变量,也可以调用 (1)
或 (3)
,但我们可以' 依靠重载决议来做到这一点。我们必须明确地告诉编译器我们想要哪个函数。为此,我们必须输入名称:
int a;
static_cast<double(*)(int)>(rad)(a); // calls (1) explicitly
static_cast<double(*)(int&)>(rad)(a); // calls (3) explicitly
关于c++重载具有不同参数的3个函数(int,* int,& int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35819949/