2012-01-26 2 views

답변

4

화살표 연산자를 별도로 오버로드해야합니다. 보다 일반적으로, C++의 관련 연산자간에 좋은 매핑이 있어도 한 연산자를 오버로드하면 나머지는 "무료"로 오버로드되고 직접 구현해야합니다.

이 수신기 객체에 대한 참조를 얻을 수 this를 역 참조하여 작동
T* Class::operator ->() const { 
    return &**this; 
} 

, 그럼 다음의 주소를 가지고, 그 operator *를 호출하기 위해 역 참조 : 말했다

, 그것은 역 참조 측면에서 화살표를 구현하기 쉽다 반환 된 참조는 화살표가 적용되어야하는 객체에 대한 포인터를 얻습니다.

Boost.Operators 라이브러리를 살펴보면 소수의 기본 작업 집합에서 논리적으로 관련된 많은 연산자를 자동으로 정의 할 수 있습니다.

희망의 도움이되었습니다.

+0

그래서 실제로 연산자 ->?의 "기본 구현"은 없습니다. – Paranaix

+0

@ Paranaix- 아니요, 불행히도 아닙니다. 일반적으로 오버로드 된 연산자의 기본 구현은 없습니다 (할당 연산자 제외). 다른 관련 연산자에서 해당 연산자를 구현할 수있는 합리적인 방법이있는 경우에도 마찬가지입니다. – templatetypedef

+0

물론 'operator->': return * (this-> operator->());'의 관점에서 단항 연산자'operator * '를 쉽게 구현할 수 있습니다. C++은 어느 쪽을 다른 쪽에서 구현해야하는지 말하지 않거나, 어느 쪽을했는지 보면서 다른쪽에 대한 기본값을 제공하기를 귀찮게합니다. 다른 연산자들과 마찬가지로 연산자를 하나 이상의 방법으로 사용할 수 있습니다 : 연산자 - = 연산자, 또는 단항 연산자 - 연산자와 연산자 + 연산자를 사용합니다. C++은 "기본 작업"이 무엇인지 말해주지 않으며 자신이 생각하는 것을 해결하려고하지 않습니다. 도움이되지 않는다면 일관성이 있습니다. –

0

본질적으로 오버로드 된 역 참조 연산자를 구현할 수 있지만 오버로드 된 연산자가 작동하려면 두 번 참조해야합니다. 클래스 X 포인터 "E1이 유형이있는 경우"

0

5.2.5은 "다음 식 E1->E2은 해당 양식을 (*(E1)).E2로 변환됩니다." 문제는 해당 경우에 E1이 아니고 포인터가 인 것입니다.