나는 다음 (g ++ 4.6.3) 나는 오류를 얻을C++ 연산자 오버로딩 : 개체에서 참조로의 변환이 알려져 있지 않습니까?
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;
}
를 컴파일하려고
/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&’
이 나를 퍼즐 - 어떻게 그 클래스에 대한 참조로 클래스의 전환 알 수 없습니까?
영향이없는 다음과 같이 클래스 A의 선언을 변경 :
class A
{
public:
A() {}
A(const A&) {}
};
같은 오류가 발생했습니다.
여기에 무슨 일이 일어나고 있는지에 대한 힌트가 있으면 매우 감사하게 생각합니다.
r 값에 대한 자세한. 그런 다음 메서드 서명은 다음과 같습니다. 'A operator * (const A & rhs) const;' 'return * this * = rhs' – Paranaix
@Paranaix : 아니요,'const * '안에'* this'에'operator * ='를 사용할 수 없습니다. 멤버 함수가'* this'를 수정할 것이므로. –
@BenVoigt : 맞습니다. 나는 그것을 하나의 라이너로 쓰고 실수로 전체 마법을 제거하려고했다. 트릭은 'this'에서 사본을 만드는 것입니다. 예 : 'ret = * this; ret * = rhs; return ret; – Paranaix