函数重载没有在C ++中发生

时间:2012-02-20 17:35:41

标签: c++

我正在使用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;
 }

7 个答案:

答案 0 :(得分:13)

在C ++中,你不能仅仅在返回类型上重载函数:

time add(time t1) {...}
void add(time t1) {...}

我建议使用重载运算符add()+替换三个+=函数。这样可以解决歧义,并且还可以清楚地说明哪些操作会修改对象,哪些操作会返回一个新对象。

答案 1 :(得分:6)

返回类型不是函数签名的一部分。

函数名,修饰符和参数是。保留函数名称并更改其他名称会导致重载。

这是因为如果你只是写add(t);,编译器就不可能知道要调用哪个方法。

1.3.11签名

  

有关参与重载决策的函数的信息(13.3):其参数类型列表(8.3.5),如果是   function是一个类成员,函数上的cv-qualifiers(如果有的话)   本身和声明成员函数的类。 [...]

这意味着,如果函数是类的一部分,您还可以通过添加const修饰符来重载它。

此外,如果声明const,则更改参数类型。

答案 2 :(得分:3)

您不能仅根据其返回类型addvoid重载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)

你不能以这种方式超载。您只能拥有一个addtime参数。

答案 6 :(得分:0)

函数重载不能仅基于返回类型进行,因为由于返回类型和赋值变量之间可能存在的隐式转换,编译器不会知道要调用哪个函数。