2011-05-03 2 views
4

std :: sort()를 사용하여 벽에 충돌했습니다. 메서드의 호출자가 파생 된 순수 가상 클래스 (Compare)가 있습니다 (이름은 MyComp). 내 API의 프로토 타입의 순수 가상 클래스를 사용C++ STL : std :: sort()에 대해 "Strict Weak Ordering"이라는 파생 가상 클래스 사용

void Object::DoSort(Compare &comp) { 
    std::sort(this->mKeys.begin(),this->mKeys.end(), comp); 
} 

발신자 :

class MyComp: public Compare { 
    bool operator()(const Row *r1, const Row *r2) { ... } 
} cmp; 
... 
obj->DoSort(cmp); 

리눅스에 g ++ 컴파일러가 불평 : "형 때문에 '비교'형식의 개체를 할당 할 수 없습니다가 '비교 나는 (순수하지 않음) 단순히 가상으로 Compare을 수정하더라도 ' "

추상 가상 기능을 가지고는 std::sort()은 여전히 ​​대신 MyComp::operator()Compare::operator() 코드를 호출합니다.

cmp (r1, r2)를 호출하면 올바르게 컴파일되고 올바른 결과를 반환합니다.

나는 틀린 일을해야하거나, 그렇지 않습니다. 도와주세요!

답변

8

std::sort (및 기타 STL 기능) 비교기는 개체가 복사되는, 그래서 값에 의해 객체하지만 (그 VTBL 포함) 파생 부품은 "멀리 슬라이스"되고 걸릴.

당신은 프록시에서 개체를 래핑 수 :

class Proxy 
{ 
private: 
    Compare &cmp; 
public: 
    Proxy(Compare &cmp) : cmp(cmp) {} 
    bool operator()(const Row *r1, const Row *r2) { return cmp(r1, r2); } 
}; 


... 

MyCompare cmp = MyCompare(); 

std::sort(x.begin(), x.end(), Proxy(cmp)); 
+0

일을 프록시 개체를 사용하는 - 나는 생각하지 않았다. –

+0

1) 매력처럼 작동합니다. 2) STL == 악. – 0x6adb015

+0

@ 0x6adb : 악의에 따라 다릅니다! 참조로 가져 가면 예를 들어 할 수 없습니다. 예를 들어'std :: sort (x.begin, x.end(), MyComparator())'와 같이 (const가 아닌 ref를 임시 객체에 바인딩 할 수 없다). –

관련 문제