2009-04-07 6 views
5

오류 :
오류 C2678 : 이진 '=='없음 연산자 (용인 변환 또는 존재) 'CONST 항목'형의 왼쪽 피연산자를 필요없는 발견C++ 템플릿 클래스 오차

기능 :

template <class T, int maxSize> 
int indexList<T, maxSize>::search(const T& target) const 
{ 
    for (int i = 0; i < maxSize; i++) 
     if (elements[i] == target) //ERROR??? 
      return i;  // target found at position i 

    // target not found 
    return -1; 
} 

indexList.h
indexList.cpp

이 오버로드 된 연산자로 생각되어 있습니까? 템플릿 클래스이므로 오류를 이해할 수 있을지 잘 모르겠습니까?

용액 - 클래스 지금 선언 CONST의 과부하 기능 :

//Operators 
bool entry::operator == (const entry& dE) const <-- 
{ 
    return (name ==dE.name); 

} 
+0

http://stackoverflow.com/a/38887476/1599699 – Andrew

답변

9

시작 :

binary '==' : no operator found which takes a left-hand operand of type 'const entry'

그것은 왼쪽 피연산자로 entry 유형을 받아들이는 임의의 == 연산자를 찾을 수 없음을 의미합니다.

entry const e; 
if (e == foo) 

당신은 우리에게 당신의 명부 클래스의 코드를 보여했지만, 그 오류에 대해 무엇 아니다 :이 코드는 유효하지 않습니다. 이 오류는 entry 유형의 연산자가 부족하다는 것을 나타냅니다. 클래스에 operator== 함수를 제공하거나 const entry&을 첫 번째 매개 변수로 사용하는 독립 실행 형 operator== 함수를 선언하십시오.

struct entry { 
    bool operator==(const entry& other) const; 
}; 
// or 
bool operator==(const entry& lhs, const entry& rhs); 

나는 후자가 선호되는 스타일이라고 생각한다.

+0

입니다. 감사합니다. 내 클래스에 연산자가 오버로드되었지만 함수가 const로 선언되지 않았습니다. –

6

문제는 운영자 == 정의를 갖지 않는 이때 사용되는 타입 T를 의미한다. 귀하의 질문에서 이것은 '클래스'항목이라고 생각합니다.

'entry'클래스에는 const 항목 &을 매개 변수로 사용하도록 올바르게 정의 된 연산자 ==가 없습니다.

+0

빙고하지만 (인라인 친구 기능) 올바른 정의를 설명 가치 또는 수하는 것은있을 수 쓸 매우 충분하다 일부 * FUN * 링커 문제 = D –

+0

왜 요소가 const이어야합니까? –

+0

템플릿 메소드가 const로 표시되어 있기 때문입니다. 즉, 컴파일러는 클래스의 내부 데이터 (요소 [i])에 대해 비 const 연산을 호출하지 않아야 함을 확인해야합니다. –

2

이것은 "const 중독"입니다. 검색 기능 선언에 const을 사용하면 호출하는 모든 다운 스트림 기능의 버전을 const 개 추가해야합니다. 함수에서

this 포인터가 그 포인터를 통해 당신이 사용하는 모든 회원뿐만 아니라 const로 간주해야 함을 의미한다 const을 고려, const을 선언했다. 귀하가 전문적으로 다루는 유형 T가 operator ==() 인 경우 명시 적으로 const 매개 변수를 지정하지 않으면이 오류가 발생합니다.

사용하는 모든 Ts에 적절한 operator ==() 호출이 있는지 확신 할 수 없으면 구성원 함수 템플릿에서 const 지정자를 제거합니다.

+0

템플릿 클래스에서 == 연산자가 정의되지 않았습니까? 이 함수에서이 const 중독을 제거하는 가장 좋은 방법은 무엇입니까? –

+0

"const poisoning"이라는 용어는 오해의 소지가 있습니다. const는 실수를하지 않고 순서대로 제약 조건을 유지하지 못하도록합니다. 한 곳에서 const를 추가한다는 것은 다른 장소에 const를 추가해야한다는 것을 의미하기 때문에 이전에 그렇게 했어야한다는 것을 의미합니다. – shoosh

+0

난 그냥 헤더에 선언에 따라 "const"제거 거라고. 연산자 ==()에 대한 const 사용 가능 래퍼 템플릿을 만들 수는 있지만 그럴 가치가있는 것보다 더 많은 문제가있을 수 있습니다. – mwigdahl

1

이 클래스에 대한 매개 변수로 사용하는 T 유형은 operator==()이어야합니다. 제공 한 코드에는 틀린 것을 알기 어려운 템플릿의 인스턴스가 포함되어 있지 않으므로,이 값은 operator==()이어야합니다.

다른 메모에서 템플릿의 함수 정의는 클래스와 함께 .h 파일에 있어야합니다. 그렇지 않으면 컴파일러에서 올바르게 인스턴스화 할 수 없습니다.

+0

의 정의는 .h –

1

사용자 정의 유형의 항등 연산자는 기본적으로 정의되어 있지 않습니다. 이것은 템플릿 클래스와 관련이 없으며 struct 또는 class "항목"입니다.

따라서 등호 연산자를 struct entry 또는 class entry으로 대체해야합니다.

또는 동등 연산자를 정의하기 위해 템플릿을 사용하는 모든 것을 강제 실행하지 않으려는 경우 템플릿 인터페이스를 수정하여 동등 비교를 수행하는 Comparator를 허용 할 수 있습니다.그것이 정확하게 오류 텍스트를 읽어

0

는 때때로

... 
    if (target == elements[i]) 
... 
관련 문제