Kiedy próbuję skompilować następujący (g ++ 4.6.3)Przeciążanie operatora C++: brak znanej konwersji z obiektu na odniesienie?
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;
}
pojawia się błąd
/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&’
To mnie zastanawia - jak można konwersja z klasy do odniesienia do tej klasy nie wiadomo?
Zmiana deklaracji klasy A w następujący sposób nie ma żadnego wpływu:
class A
{
public:
A() {}
A(const A&) {}
};
sam błąd.
Byłbym niezwykle wdzięczny za wskazówki, co się tutaj dzieje.
Możesz rozwiązać ten problem, deklarując operatora w zakresie klasy. Wtedy twój podpis metody wyglądałby tak: "Operator * (const A & rhs) const; ' Jeśli chcesz użyć operatora złożonego do implementacji, możesz napisać: 'return * this * = rhs' – Paranaix
@Paranaix: Nie, nie możesz użyć 'operator * =' na '* this' wewnątrz' const' funkcja członka, ponieważ zmodyfikowałaby '* this'. –
@BenVoigt: Tak, twoja zupełna racja. Chciałem napisać to jako jeden liniowiec i przez przypadek usunąłem całą magię. Sztuką jest stworzenie kopii z "tego". W przykładzie: "A ret = * this; ret * = rhs; return ret; ' – Paranaix