C++中没有发生函数重载
function overloading not happening in C++
我使用的是borland turbo C++编译器(4.5)。这是我的代码,但我收到的错误如下:"time::add(time)"的多个声明。在这里,我对add()进行了三次重载,错误出现在第三次重载中,即"void add(time t1)"中。
#include<iostream.h>
#include<conio.h>
class time
{
int h,m;
public:
void input()
{
cout<<"n Enter hour :";
cin>>h;
cout<<"n Enter min :";
cin>>m;
}
void display()
{
cout<<"n time is : "<<h<<":"<<m;
}
void add(time t1,time t2)
{
h=t1.h+t2.h+(t1.m+t2.m)/60;
m=(t1.m+t2.m)%60;
}
time add(time t1)
{
time t3;
t3.h=h+t1.h+(m+t1.m)/60;
t3.m=(m+t3.m)%60;
return t3;
}
void add(time t1)
{
h=h+t1.h+(m+t1.m)/60;
m=(m+t1.m)%60;
}
};
int main()
{
time t1,t2,t3;
t1.input();
t2.input();
t3.add(t1,t2);
t3.display();
t3=t2.add(t1);
t3.display();
t2.add(t1);
t2.display();
return 0;
}
在C++中,不能仅根据返回类型来重载函数:
time add(time t1) {...}
void add(time t1) {...}
我建议用重载运算符+
和+=
替换三个add()
函数。这将解决歧义,也将明确哪些操作修改对象,哪些操作返回新对象。
返回类型不是函数签名的一部分
函数名称、修饰符和参数分别为。保留函数名称并更改其他名称会导致重载。
这是因为如果只编写add(t);
,编译器不可能知道要调用哪种方法。
1.3.11签名
关于参与过载解析(13.3)的函数的信息:其参数类型列表(8.3.5),如果函数是类成员,函数上的cv限定符(如果有的话)它本身和在其中声明成员函数的类。[…]
这意味着,如果函数是类的一部分,也可以通过添加const
修饰符来重载它。
此外,如果声明为const
,则参数类型也会发生更改。
不能仅根据返回类型void
或time
重载add
函数。
在C++中,不能根据函数的返回类型重载函数,而这正是您想要做的。只能根据函数的参数或常量重载函数。
我也会考虑改用更现代的编译器,Borland C++4.5已经过时了,甚至不符合第一个C++标准,更不用说当前的标准了。
要使函数重载工作,重载中必须有不同的参数,您不能重载返回值。
void add(time t1,time t2)
void add(time t1)
很好,
time add(time t1)
void add(time t1)
不是
Rick,
问题是
time add(time t1)
和
void add(time t1)
你不能用这种方式超载。只有一个add
和一个time
参数。
函数重载不能仅基于返回类型来完成,因为编译器将不知道要调用哪个函数,因为返回类型和指定变量之间可能存在隐式转换。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载