2013-03-03 2 views
1
내가 벡터 정렬하는 비교 함수를 정의 할 필요가

정렬 :는 표준의 벡터 : 쌍

class Sched 
    { 
    public: 
    struct Op 
    { 
     // some data 
    }; 
    typedef std::pair<Op*,Clk> OpSchedule; 
    void genSched() { std::sort(m_mappedOp.begin(),m_mappedOp.end(),cmp)} 

    private: 
    std::vector<OpSchedule> m_mappedOp; 
    bool cmp(const OpSchedule& l,const OpSchedule& r) 
    { 
     return l.second< r.second; 
    } 

나는 컴파일 오류가 발생합니다 :

function call missing argument list; use '&Sched::cmp' to create a pointer to member. 

사람은 무엇을 해결하는 방법을 조언 해 줄 수 있습니다

오류의 원인은 무엇입니까? 감사합니다.

+0

@jogojapan 그래서 클래스의 네임 스페이스 내부 만드는 것입니다 : 나는 그것이 아스 커 (그리고 다른 사람들에게 유용하다고 생각 누가이 질문을 찾는다) 여러 가지 대답을 여러 가지 방법으로 똑같이 말하는 것. 때로는 두 번 읽는 것이 이해하는 데 도움이됩니다. –

+0

@sftrabbit 그래,하지만이 경우 ... 우리의 대답은 너무 유사하다. (실제로 코드에'정적 '이라는 단어를 포함하는 것을 잊어 버렸기 때문에 나의 속도는 6 초 빨라졌다.) – jogojapan

답변

6

cmp은 구성원이 아닌 static입니다. 어떤 객체에서 호출되어야합니다. 오류가 &Sched::cmp이라고 말했을 때 해당 멤버 함수에 대한 포인터를 얻으려면 Sched의 일부 객체에 바인드해야합니다. 당신이 지금하고있는대로

static bool cmp(const OpSchedule& l,const OpSchedule& r) 
{ 
    return l.second < r.second; 
} 

그런 다음 당신이 그것을 전달할 수 있습니다

그러나, static 그래서 그냥이로 변경 cmp이 아닌 일 할 이유가 없다.

† 회원 기능을 this에 바인딩하려면 std::bind(&Sched::cmp, this, std::placeholders::_1, std::placeholders::_2)으로 처리 할 수 ​​있습니다.

1

다른 옵션은 CMP 기능 클래스 외부 및 답변에 관한

void genSched() 
    { 
     using namespace <classNmaespace>; 
     std::sort(m_mappedOp.begin(),m_mappedOp.end(),cmp) 
    } 
+0

여기서 네임 스페이스 메커니즘이 어떻게 작동하는지 또는 필요한 이유를 설명해 주시겠습니까? – jogojapan

+0

클래스 내부에 cmp 함수가있는 문제는 cmp 함수에 액세스하는 것이므로 sort 메소드는 액세스 할 객체를 만들어야합니다. 이제 cmp 메서드가 전역 함수 (예 : c 함수)에 있으면 객체가없는 sort 메서드로 액세스 할 수 있습니다. – Pradheep

+0

정렬 메서드를 전역으로 만드는 것은 좋지 않습니다 .it는 C++ 캡슐화를 중단합니다. 그래서 그것은 클래스의 네임 스페이스 안에 있어야합니다. 그래서 코드는 std :: sort (m_mappedOp.begin(), m_mappedOp.end(), namespacename :: cmp)와 비슷할 것입니다. – Pradheep