2012-06-27 49 views
6

我想超载operator==,但是编译器抛出以下错误:重载==操作符抱怨“必须只有一个参数”

‘bool Rationalnumber::operator==(Rationalnumber, Rationalnumber)’ must take exactly one argument 

我的一小段代码如下:

bool Rationalnumber::operator==(Rationalnumber l, Rationalnumber r) { 
    return l.numerator() * r.denominator() == l.denominator() * r.numerator(); 
} 

声明:

bool operator==(Rationalnumber l, Rationalnumber r); 

没有人有,为什么它抛出牛逼任何想法他错误?

+1

这可能有助于:http://stackoverflow.com/questions/4421706/operator-overloading。既然你是一个成员,它已经让左侧通过隐藏的'this'参数隐式进入。 – chris

+1

您必须用一个ar定义成员函数gument或带两个参数的文件范围函数。 – harper

+0

它是会员功能还是独立功能? –

回答

1

您应该将您的operator ==从RationalNumber中移除到其他地方。 因为它是在一个类中声明的,所以认为'this'是第一个参数。从语义上看,你可以向编译器提供3个参数。

12

如果operator==是一个非静态数据成员,是应该只有一个参数,作为比较将是隐式this参数:

class Foo { 
    bool operator==(const Foo& rhs) const { return true;} 
}; 

如果你想使用免费的运营商(即不是一个类的成员),那么你可以指定两个参数:

class Bar { }; 
bool operator==(const Bar& lhs, const Bar& rhs) { return true;} 
2

作为成员运算符重载它应该只有一个参数,另一个是this

class Foo 
{ 
    int a; 

public: 
    bool operator==(const Foo & foo); 
}; 

//... 

bool Foo::operator==(const Foo & foo) 
{ 
    return a == foo.a; 
} 
0
friend bool operator==(Rationalnumber l, Rationalnumber r); 

你把它声明为非成员函数,它可以采取两个参数。当您将其声明为成员函数时,它只能使用一个参数。

0

如果要声明一个const SpreadSheetCell &运营商+(常量SpreadSheetCell & LHS,常量SpreadSheetCell &右);那么第一个参数就是一个“this”指针。因此,抛出一个错误为”

错误: '常量SpreadSheetCell & SpreadSheetCell ::运算符+(常量SpreadSheetCell &,常量SpreadSheetCell &)' 必须采取零个或一个参数

如果你想拥有一个。两个参数函数,那么你必须在类之外声明相同的函数并使用它

相关问题