算术运算符(+)运算符是否会检查返回类型和传递参数?

时间:2015-06-18 05:26:59

标签: c++ c++11 visual-c++

#include<iostream>
using namespace std;
class B;
class A {
private:
    int a,b;
public:
    A() {
        a=b=10;
    }
    void show() {
        cout<<"Hello of A: \n a:"<<a<<"  b:"<<b;
    }
friend  A operator+( A AA ,B BB) ;
friend  B operator+ ( B BB,A AA);
friend  B operator+( A AAA ,B BB) ; 
};
class B {
private:
    int c,d;
public:
    B() {
        c=d=20;
    }
    void show() {
        cout<<"\nHello of B: \n c:"<<c<<" d:"<<d;
    }
friend  A operator+ ( A AA,B BB);
friend  B operator+ ( B BB, A AA);
friend  B operator+( A AA ,B BB) ;
};
A operator+(A AA ,B BB) {
         A temp ;
         temp.a = AA.a + BB.c;
         temp.b = AA.b + BB.d; 
         return temp;
}
B operator+( B BB, A AA) {
        B temp;
        temp.c = AA.a+BB.c;
        temp.d = AA.b+BB.d;
        return temp;
} 

int main() {
class A aa;class B bb;
class A aa1 = aa + bb;
aa1.show();
class B bb1 = bb + aa;
bb1.show() ;
}

您好,我刚试过这个程序并且编译错误为朋友A操作员+(A AA,B BB);被重新定义为朋友B运营商+(A AA,B BB); 因为我理解重载将检查返回类型和传递参数。 但在这里我不知道为什么我得到编译时标记错误,函数重定义已经完成!! 有人可以帮助我!!

以下是我尝试在unix终端中运行时遇到的错误

CC overloading.cpp

&#34; overloading.cpp&#34;,第17行:错误:运算符+(A,B),返回B,之前声明返回A. &#34; overloading.cpp&#34;,第29行:错误:运算符+(A,B),返回A,之前已声明返回B. &#34; overloading.cpp&#34;,第31行:错误:运算符+(A,B),返回B,之前声明返回A. &#34; overloading.cpp&#34;,第33行:错误:运算符+(A,B),返回A,之前已声明返回B. &#34; overloading.cpp&#34;,第45行:错误:&#34;运算符+(A,B)&#34;之间的歧义过载和&#34;运算符+(A,B)&#34;。 5检测到错误。 #

我怎样才能使用B类b2 = aa + bb;在上面的代码中?

1 个答案:

答案 0 :(得分:3)

函数的返回类型不参与重载决策。只有函数名称和参数列表(以及成员函数的cv限定符)才有意义。但我在代码中看不到多个定义。错误是您使用不同的返回类型重新声明了相同的函数:

friend  A operator+( A AA ,B BB) ;
friend  B operator+( A AAA ,B BB) ; // same function, different return type!