2012-06-27 8 views
6

Estoy tratando de sobrecargar el operator==, pero el compilador está lanzando el siguiente error:operador de sobrecarga == quejándose de 'debe tener exactamente un argumento'

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

Mi pequeño fragmento de código es el siguiente:

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

Declaración:

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

¿alguien tiene alguna idea de por qué se lanzan t el error?

+1

Esto podría ayudar: http://stackoverflow.com/questions/4421706/operator-overloading. Sin embargo, como el suyo es un miembro, ya tiene el lado izquierdo entrando implícitamente a través del argumento oculto 'this'. – chris

+1

Debe definir la función del miembro con un ar gument o la función de alcance de archivo con dos argumentos. – harper

+0

¿Es una función miembro o una función independiente? –

Respuesta

1

Debe quitar su operador == de un RationalNumber a otro lugar. Como se declara dentro de una clase, se considera que 'este' es el primer argumento. Desde la semántica, se ve que ofreces 3 argumentos a un compilador.

12

Si operator== es un miembro de datos que no son estáticos, es sólo debe tomar un parámetro, como la comparación será a lo implícito this parámetro:

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

Si desea utilizar un operador libre (es decir, no una miembro de una clase), entonces se puede especificar dos argumentos:

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

Como miembro de operador sobrecargar lo que debería solo toma un argumento, el otro es 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); 

cuando se declara como función no miembro, puede tomar dos argumentos. cuando lo declaras como función miembro, solo puede tomar un argumento.

0

Si se declara una constante SpreadSheetCell & operador + (const SpreadSheetCell & LHS, const SpreadSheetCell & RHS); entonces el primer argumento es actuar como un puntero "this". Por lo tanto, lanzar un error como"

error:. 'Const SpreadSheetCell & SpreadSheetCell :: operador + (const SpreadSheetCell &, const SpreadSheetCell &)' debe tener cero o un argumento

Si usted quiere tener una. función de dos argumentos, luego debe declarar la misma función fuera de la clase y usarla.