2017-02-25 8 views
4

classkey으로 지정하고 map에 넣으므로 operator+을 오버로드합니다. 친구 기능으로 과부하하면 잘 작동합니다. 클래스의 멤버 함수로 오버로드하면 컴파일 오류가 발생합니다.보다 작음 연산자를 멤버 함수로 오버로드 할 수 없습니다.

error C2678: binary '<': no operator found which takes a left-hand operand of type 'const Syl' (or there is no acceptable conversion)'.

세부 정보,이 컴파일하고 컴파일 오류를 생성하지 않습니다

Syl.h

bool operator< (const Syl& rhs); 

Syl.cpp

bool Syl::operator< (const Syl& rhs) { return false; } 

을이 컴파일하는 동안.

Syl.h

friend bool operator< (const Syl& lhs, const Syl& rhs); 

Syl.cpp

bool operator< (const Syl& lhs, const Syl& rhs) { return false; } 

나는 이유를 알고하지 않습니다. 나는 연산자가 <이 바이너리라는 것을 알고 있지만 어쨌든 함수 멤버로 오버로드 할 수 있습니까?

+1

과부하 해결 방법과 암시 적 변환이 작동하기 때문에 어쨌든 '친구'버전이 더 좋습니다. –

+0

친숙한 버전은 양쪽 피연산자를'const'로 지정합니다. 다른 버전은 입력 매개 변수가'const'라고 말합니다. 메소드를 이와 같이 표시해야합니다 ... 오류를주의 깊게 읽어야하고,'const','signed' 등과 같은 단어의 의미에 특별한주의를 기울여야합니다. – Kupto

답변

3

일반적으로 operator<과 같은 멤버 연산자는 작동하는 개체를 수정하지 않습니다. 즉, 상기 방법은 선언의 끝에 키워드 const 바꾸어 일정하다고 지정해야하는 경우, 즉

class Syl { 
    ... 
    public: 
    bool operator<(const Syl& rhs) const; 
} 

같은 운영자가 그러한 std::map 같은 STL 용기와 함께 사용할 수는이면.


멤버 연산자의 현재 버전, 독립 사업자로 번역 할 때와 같을 것이다

friend bool operator<(Syl& lhs, const Syl& rhs); 

공지 사항 lhs에 대한 const의 부족. 그것은 여전히 ​​정확하지만 본질은 아닙니다. l 값을 lhs으로 입력해야합니다. 다른 것을 제공하면 ``연산자가 없습니다 ... '' 오류가 발생합니다. STL std::map은 템플릿 구현의 어딘가에서 표준 헤더에서 비롯된 오류를 예상하지 않습니다.

+1

그래서 컴파일 시간 오류는 그는 오버로드 된 연산자를 선언했다는 점에서 멤버 오버로드 된 연산자는 두 인수가 모두 const 인 경우 오버로드 된 연산자 만 받아들이는지도를 정렬하는 데 사용된다는 사실에서 비롯된 것입니다. – user

+0

네, 맞습니다. –

+0

맞습니다 - 연산자는'const' 일 필요는 없습니다. 일부는 일반적으로 (예 :'operator =') 아니며 일부는 일반적으로 있습니다. 그러나 const가 아닌 연산자는 왼쪽 인자로'lvalue'를 요구합니다. 만약 당신이 그것을 제공하지 않으면 비슷한 에러를 보게 될 것입니다. – CygnusX1

2

가정 aba < b 경우 aconst 인 표현의 유형 Syl 모두, 첫 번째 (회원 양식) 유효하지 않습니다, 그리고 컴파일 오류가 발생합니다.

그 문제를 해결하려면, 당신은 표현 a < b에, 그 뒤에 const없이

bool operator< (const Syl& rhs) const; // note the trailing const 

으로 회원에게 operator<()를 지정해야 aconst 수 없습니다 (즉 operator<()는 변경 허용된다).

두 피연산자 모두 const 참조로 지정되어 있으므로 두 번째 형식이 정확합니다.

<과 같은 비교 연산자는 일반적으로 피연산자 중 하나를 변경하지 않습니다. const 한정자는 그 사실을 전달합니다.

회원 양식 또는 비회원 양식을 제공 할 수 있습니다. 둘 다 제공하면 모호함으로 인해 오류가 발생합니다 (컴파일러는 a < b과 같은 표현식을 볼 때 다른 컴파일러를 선호하지 않습니다).

+0

고마워요, 그 작품! – Tris