2011-06-13 252 views
2

为什么这个代码给出错误消息“智能感知:这个操作符的功能太多的参数”运营商+超载问题

int operator+(PerfectNum a,PerfectNum b) 
{ 
    return (a.thenum+b.thenum); 
} 

PerfectNum是一个普通班,并thenum是一个int。 此方法在课程中。

+3

这不是类方法吗?如果你使它成为PerfectNum的一种方法,那么你只需要一个参数,并使用“this.thenum”作为另一个参数。 – sleeves 2011-06-13 22:28:00

+1

这是你从编译器得到的确切错误信息吗?函数'int operator +(PerfectNum,PerfectNum)'返回太多参数? – Oswald 2011-06-13 22:28:52

+0

没有编译器会产生这样的错误信息。在这里发布编译器输出时请使用复制和粘贴。 – 2011-06-13 22:29:57

回答

6

你正在将它定义为一个成员函数,对吧?

在这种情况下,左侧是简单*this

// .h 
class PerfectNum 
{ 
    public: 
    int operator+(PerfectNum other) const; 
}; 

// .cpp 
int PerfectNum::operator+(const PerfectNum &other) const 
{ 
    return this->thenum + other.thenum; 
} 
+3

错误的种类。运营商应该是一个免费的功能,可能是一个朋友。如果它是一个成员,它应该是const。该参数应该是一个常量引用。语法错误 - 实现缺少返回类型。谁在投票这个东西? – 2011-06-13 22:54:23

+0

糟糕。你是对的,这是非常可怕的。昨天我有一个相当紧张的工作日,我需要摆脱它,但显然我留下了一些我的知识:-) – 2011-06-14 14:29:20

+0

另外:我看到没有理由,这不能成为一个成员函数。我可能会错过一些知识。请*帮助我,而不是仅仅批评一切,如果是这样的话。我认为它应该是一个成员函数,因为它可以解释为什么有太多的参数*(根据OP的错误信息)。 – 2011-06-14 14:34:00

4

你需要让你的运营商一个非成员函数。

+0

+1 Sheesh。由于所有的答案都是错误的答案,只有一个答案是正确的,所以我觉得不得不在这里投票。还有其他所有正确回答此问题的人。 – 2011-06-14 00:26:26

+0

对于为什么它不应该是成员函数,我可以有一个很好的解释吗?我被教导说,当你想限制它成为左手边的“PerfectNum”时是可以的;因为OP只希望它位于两个'PerfectNum'对象之间,所以我认为成员函数是要走的路。 – 2011-06-14 14:32:00

1

运算符+应该是非成员函数。返回类型应该是const对象。如果你有operator = defined,那么最好还是定义operator + =。所以,你可以用operator + =来实现operator +。

const PerfectNum operator+(const PerfectNum& lhs, const PerfectNum& rhs) 
{ 
    PerfectNum ret(lhs); 
    ret += rhs; 
    return rhs; 
} 
1

当声明为类方法时,重载操作符+肯定不应该是朋友/自由函数。这里有一个非常简单的实现:

class PerfectNum { 
    public: 
     PerfectNum(int); 
     PerfectNum(const PerfectNum&); 
     PerfectNum operator+(const PerfectNum&) const; 
    private: 
     int mNumber; 
}; 

PerfectNum PerfectNum::operator+(const PerfectNum& rhs) const 
{ 
    return PerfectNum(this->mNumber + rhs.mNumber); 
}