2012-06-27 12 views
6

Sto cercando di sovraccaricare il operator==, ma il compilatore sta gettando il seguente errore:overloading degli operatori == lamentando 'deve prendere esattamente un argomento'

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

mio breve pezzo di codice è il seguente:

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

Dichiarazione:

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

qualcuno ha qualche idea perché è gettando t lui errore?

+1

Questo potrebbe aiutare:.. http://stackoverflow.com/questions/4421706/operator-overloading Dal momento che il vostro è un membro, però, ha già il lato sinistro che entra implicitamente attraverso l'argomento 'this' nascosto. – chris

+1

È necessario definire la funzione membro con un ar gument o la funzione scope del file con due argomenti. – harper

+0

E 'una funzione di membro o di una funzione di free standing? –

risposta

1

È necessario rimuovere l'operatore == da un numero Rational in un'altra posizione. Come viene dichiarato all'interno di una classe, si considera che 'this' è il primo argomento. Dalla semantica si vede che offri 3 argomenti a un compilatore.

12

Se operator== è un membro di dati non statici, è dovrebbe prendere un solo parametro, come il confronto sarà al implicita this parametri:

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

Se si desidera utilizzare un operatore libero (cioè non un membro di una classe), è possibile specificare due argomenti:

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

Come membro operatore sovraccaricare dovrebbe prendi solo un argomento, l'altro è 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); 

quando si dichiara come funzione non-membro, si può prendere due argomenti. quando lo dichiari come funzione membro, può prendere solo un argomento.

0

Se si dichiara una const SpreadSheetCell & operator + (const SpreadSheetCell & sx, const SpreadSheetCell & sd); quindi il primo argomento funge da "questo" puntatore. Quindi, lanciare un errore come"

errore:. 'Const SpreadSheetCell & SpreadSheetCell :: operator + (const SpreadSheetCell &, const SpreadSheetCell &)' deve prendere zero o un argomento

Se si desidera avere a. due funzioni argomento, allora si deve dichiarare la stessa funzione di fuori della classe e usarlo

Problemi correlati