Quando provo a compilare il seguente (g ++ 4.6.3)Sovraccarico dell'operatore C++: nessuna conversione nota da oggetto a riferimento?
class A {};
A& operator*=(A& a, const A& b)
{
return a;
}
A operator*(const A& a, const A& b)
{
return A(a) *= b;
}
int main(int, char*[])
{
A a, b;
a = a*b;
return 0;
}
ottengo l'errore
/tmp/test.cxx: In function ‘A operator*(const A&, const A&)’:
/tmp/test.cxx:14:20: error: no match for ‘operator*=’ in ‘(* & a) *= b’
/tmp/test.cxx:14:20: note: candidate is:
/tmp/test.cxx:6:1: note: A& operator*=(A&, const A&)
/tmp/test.cxx:6:1: note: no known conversion for argument 1 from ‘A’ to ‘A&’
Questo mi lascia perplesso - come può una conversione da una classe a un riferimento a quella classe non essere conosciuto?
Modifica della dichiarazione di classe A come segue non ha alcun effetto:
class A
{
public:
A() {}
A(const A&) {}
};
stesso errore.
Sarei estremamente grato per suggerimenti su cosa sta succedendo qui.
È possibile risolvere questo problema dichiarando l'operatore nel campo di applicazione della classe. Quindi la firma del metodo sarà simile a: 'Un operatore * (const A & rhs) const;' Se si desidera utilizzare l'operatore composto per l'implementazione, è possibile scrivere: 'return * this * = rhs' – Paranaix
@Paranaix: No, non è possibile utilizzare 'operator * =' su '* this' all'interno di' const' funzione membro, poiché modificherà '* questo'. –
@ BenVoigt: Sì, il tuo completamente giusto. Volevo scriverlo come una fodera e rimossi per errore tutta la magia. Il trucco è creare una copia da "questo". Nell'esempio: 'A ret = * this; ret * = rhs; return ret; ' – Paranaix