2012-08-24 6 views
-1

을 사용하여 실수를 찾을 수 없습니다 내가 가지고 :는 set_difference 알고리즘

"object.h"

namespace objectNS 
{ 
    class object 
    { 
    public: 
     int m_number; 
     bool operator== (const object& object) const; 
     bool operator< (const object& object) const; 
    }; 
    class compare 
    { 
    public: 
     bool operator()(const object*, const object*) const; 
    }; 
} 

"object.cpp"

#include "object.h" 
typedef objectNS::object OBJECT; 
bool OBJECT::operator== (const object &object) const 
{ 
    return this->m_number == object.m_number; 
} 

bool OBJECT::operator< (const object &object) const 
{ 
    return this->m_number < object.m_number; 
} 

bool objectNS::compare::operator() (const object* obj1, const object* obj2) const 
{ 
    return obj1->m_number > obj2->m_number; 
} 

내가 몇 가지를 얻었다을 개체와 함께 작동하는

void f(void) 
{ 
    set<Compound_object*> detectedObjects; 
    set<Compound_object*> deleteFromTrackedObjects; 
    set_difference(detectedObjects.begin(), detectedObjects.end(), this->m_trackedObjects.begin(), this->m_trackedObjects.end(), inserter(addToTrackedObjects, addToTrackedObjects.end())); 
} 

문제 설명 :m_number으로하는 두 인스턴스을 비교 한이 을 행한다 operator<operator== 구현되지만 세트 detectedObjectstrackedObjects 동일한 m_number와 요소의 std::set_difference 복귀 를 포함 할 때 모든 요소가 예상대로 빈 결과 집합 대신 사용됩니다.

나는 함수 객체 compare을 템플릿 인수로 설정하려고했지만 심지어 결과적으로 =!=에 대한 컴파일러 오류가 많이 발생하여 제대로 정의되지 않았습니다.

무엇이 문제일까요?

+0

코드를 게시하시기 바랍니다 :

당신이 set_difference로 설정 인스턴스의 모든에 동일한 비교 유형을 제공하고 있는지 확인해야합니다, 비교기를 사용하려면 ('m_number' 대'm_numberOfObject', 멤버가 아닌 함수에서는'this'), 최소한으로 유지하십시오 (어떤 것이'compare'입니까?). 들여 쓰기. – avakar

+2

관련된 typedef를 이해하기가 어려울 수도 있지만 선언문에서 객체 자체보다는 객체에 _pointers_가 포함되어있는 것으로 보입니다. 이 경우 객체 클래스의 일부로 정의 된'operator < '는 적용되지 않습니다. – jogojapan

+0

@ jogojapan, 네, 고마워요, 합리적인 것 같아요. 나는 그것에 관심을 기울이지 않았습니다. 그래서 나는 적절한 클래스를 비교 자로 정의하고 그것을 set에 대한 인자로 명시 할 필요가 있는가? 그러나 내가 그 "=", "! ="을 정의하지 못하게하는 이유는 내 비교 클래스를 집합에 대한 인수로 제공하는 동안 무엇입니까? –

답변

2

왜 개체 자체 대신 포인터를 개체에 저장하는지 알 수 없습니다. 우리가 컴파일 할 수

set<Compound_object*, compare> m_trackedObjects; 

set<Compound_object*, compare> detectedObjects; 
set<Compound_object*, compare> deleteFromTrackedObjects; 
set_difference(detectedObjects.begin(), detectedObjects.end(), 
    this->m_trackedObjects.begin(), this->m_trackedObjects.end(), 
    inserter(addToTrackedObjects, addToTrackedObjects.end()), 
    compare()); 
+0

ecatmur, 상세하고 영리한 설명을 위해 대단히 감사합니다. 이제 코드가 컴파일되고 예상대로 작동합니다! 문제는 : comp funct object를 인수로 인수에 포함 시켰지만 인수로 알고리즘 set_difference에 포함하는 것을 잊었습니다. 다시 한번 감사 드리며 좋은 하루 되세요! –