C++ c++;重载3个具有不同参数(int、*int和int)的函数

C++ c++;重载3个具有不同参数(int、*int和int)的函数,c++,pointers,reference,overloading,sqrt,C++,Pointers,Reference,Overloading,Sqrt,所以我有一个家庭作业要做“使用函数重载定义3个具有相同名称但具有不同prams类型(int,int*,int&)的函数,它们将返回值的平方根。”我做了,但我不知道它给了我这个错误:“对重载函数的不明确调用”。我试图修复它,但没有成功。。。 这是我的代码,非常简单: #define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <iostream> using namespace std; double rad(in

所以我有一个家庭作业要做“使用函数重载定义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));
}
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
使用名称空间std;
双rad(int);
双rad(int*);
双rad(int&);
int main(){
int a,*pt=&a;
cin>>a;

cout鉴于这些声明:

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
inta;
静态_cast(rad)(a);//显式调用(1)
静态_cast(rad)(a);//显式调用(3)

其他答案的前奏: 呼叫

看起来一样-拉德(a)。 线路


调用rad(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));
}
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
使用名称空间std;
双rad(int);
双rad(int*);
双rad(int&&);
int main(){
int a,*pt=&a;
cin>>a;

cout
double-rad(int&x)
double-rad(int-x)
会混淆编译器。也许您应该在回答的同时提供一个解释。要调用引用参数函数,可以通过
static\u cast
将函数名转换为指向此函数类型的指针来消除调用的歧义。我不会调用赋值“不合逻辑”。相反,它教会了好学生(试图调用函数重载的学生)关于重载解析的模糊性,以及关于不做什么的内容。@Cheersandhth.-Alf Yeah,这是一个很好的观点。删除了那一行。你应该使用右值引用,因为“int”可以隐式转换为“int&”。好吧,我用调试器运行代码,似乎从未调用过第三个函数。对于rad(pt)和rad(&a)它们使用相同的函数double rad(int*x);
rad(int)
rad(int& x)
rad(&a);
#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));
}