这个函数重载正确吗? 在一个C++程序中考虑这四个函数: void a(int val) { cout<<val; } void a(int &val) { cout<<val; } void a(int *val) { cout<<val; } void a(double val) { cout<<val; }
唯一的问题是功能:这个函数重载正确吗? 在一个C++程序中考虑这四个函数: void a(int val) { cout<<val; } void a(int &val) { cout<<val; } void a(int *val) { cout<<val; } void a(double val) { cout<<val; },c++,overloading,C++,Overloading,唯一的问题是功能: void a(int &val) 及 编译器将创建以下错误: Compilation error time: 0 memory: 3140 signal:0 prog.cpp: In function 'int main()': prog.cpp:28:8: error: call of overloaded 'a(int&)' is ambiguous a(iTmp); ^ 因为他无法区分两者,如果删除其中一个,编译就会成功 见
void a(int &val)
及
编译器将创建以下错误:
Compilation error time: 0 memory: 3140 signal:0
prog.cpp: In function 'int main()':
prog.cpp:28:8: error: call of overloaded 'a(int&)' is ambiguous
a(iTmp);
^
因为他无法区分两者,如果删除其中一个,编译就会成功
见示例:
#include <iostream>
using namespace std;
void a(int val)
{
cout<<val;
}
void a(int *val)
{
cout<<val;
}
void a(double val)
{
cout<<val;
}
int main() {
int iTmp = 0;
int *pTmp = 0;
double dTmp = 0.0;
a(iTmp);
a(iTmp);
a(pTmp);
a(dTmp);
return 0;
}
#包括
使用名称空间std;
无效a(int val)
{
cout编译器必须能够知道调用什么函数
与
a(int&i)
和c(int&i)
都是可接受的候选者,编译器会抛出错误
及
将遇到相同的问题。这两个功能将导致问题
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
void a(int val)
{
最明显的问题是
void a(int val) {
及
使用iTmp
调用时不明确
除此之外,根据变量是全局变量还是局部变量,代码使用的是未初始化变量->UB以及
void a(int* val) {
std::cout << val << std::endl;
}
void a(int*val){
std::cout您的代码将编译,但调用
int iTmp;
a(iTmp);
将产生一个不明确的重载解析调用,因为
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
这些是标准的转换序列,检查整个[over.ics.rank]p3.2
列表是否有更好的转换序列(两种情况下的精确匹配)
因此,它们被认为是“不可区分的”
一句忠告:变量也没有初始化(如果是自动变量),即使你的代码编译了,输出也没有定义。我觉得实现似乎是正确的。有什么实际问题吗?@Codor我也不确定。。这是一个采访问题A(iTmp)
是amgiguous。会出现什么错误?调用void a(int-val)
将无法与调用void a(int-val)区分开来
?第一个和第二个函数是不明确的-它们以完全相同的方式调用,因此无法确定您想要哪一个。变量未初始化,它们可以或不能有0(零/空指针)的值,输出不保证(根据标准)正如示例中所描述的那样!你是对的,我采用了提问者的示例-现在我初始化了它们,很抱歉,因为他[编译器]不能同时区分这两个…嗯..这说得不对。编译器可以明确地区分它们,只是(语言)不允许这样做考虑其中一个比另一个更好,这就是为什么它有歧义的原因。
void a(int val) {
void a(int& val) {
void a(int* val) {
std::cout << val << std::endl;
}
int iTmp;
a(iTmp);
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
int->int
int->int&