2011-10-12 4 views
1

매개 변수에서 포인터를 가져 오는 '>'연산자를 오버로드하려고하는데 "연산자> 형식 클래스의 매개 변수가 하나 이상 있어야합니다."라는 오류 메시지가 나타납니다. 포인터를 사용하지 않으면 오류가 발생하지 않습니다.매개 변수에서 포인터를 사용하는 연산자 오버로드

참고 : S1은 elem뿐만 아니라 typedef 된 구조입니다.

bool operator>(S1 const *V1, S1 const *V2){ 
    if (V1->elem->code > V2->elem->code) 
     return true; 
    return false; 
} 

나는 예를 들어, 다음과 같은 경우에 연산자를 사용

S1 * funct(S1 *var1, S1 *var2){ 
    if (var1 > var2) 
     return var1; 
    return var2; 
} 
+0

왜 참조를 사용하고 비교를 위해 포인터를 역 참조하지 않습니까? 즉. 'if ((* var1)> (* var2))' – GWW

답변

1

컴파일러는 두 개의 포인터 값을 비교로 예를 설정하는 것이 좋습니다. 하나의 매개 변수를 클래스 유형으로 사용하면 과부하를 해결하기 위해 알아야 할 정보를 알 수 있습니다.

bool operator>(const S1& V1, const S1& V2){ 
    if (V1.elem->code > V2.elem->code) 
     return true; 
    return false; 
} 

S1 * funct(S1 *var1, S1 *var2){ 
    if (*var1 > *var2) 
     return var1; 
    return var2; 
} 

또한, 나는 이것에 약간 녹슨 해요,하지만 난 당신이 S1의 친구로 연산자를 선언하거나 그것을 일원이 확인해야합니다 생각합니다.

+0

다른 함수보다 더 많은 친구 나 멤버 일 필요는 없습니다. S1의 개인 또는 보호 된 구성원에 액세스하려고 시도하는 경우에만 친구 여야합니다. – Mankarse

+0

아, 그래, 고마워, 만 칸스. 내가 회원이 아닌 이들 중 한 명을 한 이후로 꽤 오래되었습니다. – kylben

+0

Mankarse의 답변에 대해서는 잘 모르겠지만이 솔루션은 저에게 효과적이라고 생각합니다. 감사 – MrRoy

2

포인터에 대해 operator<이 이미 정의되어 있기 때문에 작동하지 않습니다. 내장 유형에 대해 이해할 수있는 모든 연산자가 이미 정의되었으므로 내장 유형에 연산자를 오버로드하는 것은 불가능합니다.

1

필자가 생각하기에, 하나 이상의 parameter.there가있는 새로운 연산자를 정의하고자 할 때 반드시해야 할 두 가지가있다.

  1. 오버로드 연산자는 클래스 외부에서 정의해야합니다.
  2. 오버로드 연산자는 친구 함수 또는 클래스의 클래스로 선언해야합니다.

그건 내 경험입니다.