Cuando intento compilar el siguiente (g ++ 4.6.3)Sobrecarga del operador C++: ¿no se conoce conversión de objeto a referencia?
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;
}
consigo el error
/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&’
Esto me intriga - ¿cómo puede una conversión de una clase a una referencia a esa clase no ser conocido?
Cambio de la declaración de la clase A de la siguiente no tiene ningún efecto:
class A
{
public:
A() {}
A(const A&) {}
};
mismo error.
Estaría muy agradecido por las sugerencias sobre lo que está sucediendo aquí.
Puede solucionar este problema al declarar el operador en el ámbito de la clase. Entonces su firma de método se vería así: 'Un operador * (const A & rhs) const;' Si desea utilizar el operador compuesto para la implementación, puede escribir: 'return * this * = rhs' – Paranaix
@Paranaix: No, no puede usar 'operator * =' on '* this' dentro de un' const' función de miembro, ya que modificaría '* this'. –
@BenVoigt: Sí, tienes razón. Quería escribirlo como un trazador de líneas y accidentalmente eliminé toda la magia. El truco es crear una copia de 'esto'. En el ejemplo: 'A ret = * this; ret * = rhs; return ret; ' – Paranaix