我正在使用borland turbo C ++编译器(4.5)。这是我的代码,但我收到如下错误:'time :: add(time)'的多个声明。这里我重载了add()三次错误来自第3次重载,即“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;
}
答案 0 :(得分:13)
在C ++中,你不能仅仅在返回类型上重载函数:
time add(time t1) {...}
void add(time t1) {...}
我建议使用重载运算符add()
和+
替换三个+=
函数。这样可以解决歧义,并且还可以清楚地说明哪些操作会修改对象,哪些操作会返回一个新对象。
答案 1 :(得分:6)
函数名,修饰符和参数是。保留函数名称并更改其他名称会导致重载。
这是因为如果你只是写add(t);
,编译器就不可能知道要调用哪个方法。
有关参与重载决策的函数的信息(13.3):其参数类型列表(8.3.5),如果是 function是一个类成员,函数上的cv-qualifiers(如果有的话) 本身和声明成员函数的类。 [...]
这意味着,如果函数是类的一部分,您还可以通过添加const
修饰符来重载它。
此外,如果声明const
,则更改参数类型。
答案 2 :(得分:3)
您不能仅根据其返回类型add
或void
重载time
函数。
答案 3 :(得分:3)
在C ++中,您不能在其返回类型上重载函数,这是您尝试执行的操作。您只能对其参数或常量重载函数。
我还考虑转向更现代的编译器,Borland C ++ 4.5已经过时,甚至不符合第一个C ++标准,更不用说当前的标准了。
答案 4 :(得分:2)
要使函数重载工作,您必须在重载中使用不同的参数,否则可能不会重载返回值。
void add(time t1,time t2)
void add(time t1)
很好,
time add(time t1)
void add(time t1)
不是
答案 5 :(得分:0)
瑞克,
问题是
time add(time t1)
和
void add(time t1)
你不能以这种方式超载。您只能拥有一个add
个time
参数。
答案 6 :(得分:0)
函数重载不能仅基于返回类型进行,因为由于返回类型和赋值变量之间可能存在的隐式转换,编译器不会知道要调用哪个函数。