문제

안녕하세요 저는 이와 같은 코드를 가지고 있습니다. 친구 과부하 작업자와 변환 연산자 모두 비슷한 기능을 가지고 있다고 생각합니다. 그러나이 경우 친구가 과부하 된 운영자가 호출되는 이유는 무엇입니까? 규칙은 무엇입니까?

정말 고마워!

class A{

    double i;
public:
    A(int i):i(i) {}
    operator double () const { cout<<"conversion operator"<<endl;return i;}                            // a conversion operator
    friend bool operator>(int i, A  a);                            // a friend funcion of operator >
};

bool operator>(int i, A  a ){
    cout<<"Friend"<<endl;
    return i>a.i;
}
int main()
{
    A  aa(1);
     if (0 > aa){
         return 1;
      }
}
도움이 되었습니까?

해결책

과부하가 발생한 경우 전환이 필요하지 않습니다 operator> 부름. 내장을 위해 operator> 호출하려면 하나의 변환이 필요합니다 (사용자 정의 변환 연산자. 과부하 해상도는 필요한 변환이 적은 옵션을 선호하므로 과부하가 발생했습니다. operator> 사용.

과부하의 정의를 변경하려면 operator> 예를 들어 :

friend bool operator>(double i, A  a);

오버로드 된 두 가지가 있으므로 컴파일 오류가 발생합니다. operator> 그리고 내장 operator> 하나의 변환이 필요하며 컴파일러는 모호성을 해결할 수 없습니다.

다른 팁

나는 내 대답이 표준에 의해 뒷받침된다고 주장하지는 않지만 논리적으로 생각하자.

이 라인을 쳤을 때 :

0 > aa

두 가지 옵션이 있습니다. 제공된 연산자에게 전화하십시오.

friend bool operator>(int i, A  a);

100% 호환이거나 목적지에 도달하기 위해 두 번의 전환을 할 수 있습니다! 어느 것을 선택 하시겠습니까?

변환 연산자를 추가하면 유형 A의 객체가 예상치 못한 경우 두 배로 변환 될 수 있습니다.

좋은 프로그램은 그의 수업을 실수로 사용하는 방법을 제공하지 않으며 전환 연산자는 의도하지 않은 상황에서 클래스가 사용될 수있는 어설 션을 열어줍니다 (일반적으로 컴파일 시간 오류가 예상되는 상황이 아닙니다. 자동 유형 변환).

결과적으로 전환 연산자 (및 단일 인수 생성자)는 상황이 적게 기대할 때 전환 할 수 있기 때문에 약간의주의를 기울여야합니다.

그것은 an이기 때문에 호출됩니다 정확히 일치 표현의 맥락에서 0 > aa. 사실, "왜"질문을 어떻게 생각해 냈는지 알아내는 것은 어렵습니다. 논리적으로, 친구가 "왜"질문을 기대할 것입니다. 그렇지 않았습니다 이 경우에 호출됩니다.

표현식을 변경하면 0.0 > aa, 중성자 경로가 다른 경로보다 낫기 때문에 호출은 모호한 것이 모호합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top