2013-04-30 3 views
0

인사말 specials 개체에 std :: sort 알고리즘을 사용하려고합니다. B.cpp멤버 함수에 대한 포인터의 구문 오류

void B::FindClosest(vector<A*> list) 
     {  
      bool (B::*ptr)(A*,A*) = &B::Closer;  
      sort(list.begin(),list.end(),(this->*ptr)); 
      // some use of this sorted list 
     } 

    bool B::Closer(A* lhs ,A* rhs) 
    { 
     if(Distance(this,lhs)<Distance(this,rhs)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

그리고 BH의

흥미로운 부분 :

class B : public A 
    public: 
    void FindClosest(vector<A*>); 
    bool Closer(A*,A*); 

이 아주 간단하지만 난 것 같다 나는 나에게 비교를 줄 정렬 목록과 바이너리 기능을 가지고 왜 작동하지 않는지 알 수 없습니다. 그것은 회원 함수에 대한 포인터에서 뭔가 잘못하고있는 것 같지만 무엇을 찾을 수없는 것 같습니다. 나는 사물이 작동하지 아무것도 갈 수있는 다른 방법을 시도했습니다

agglomerate.cpp:32: error: invalid use of non-static member function 

: 여기

오류 MSG이다.

회원 기능에 대한 포인터에 바인딩되지 않았습니다. 간단하지만 다른 방법이 있다면 환영합니다.

고마워,

Azhrilla

당신은 유형의 두 개체를받을 호출 개체를해야합니다, 당신은 sort 세 번째 매개 변수 때문에,이 경우에 std::bind 또는 boost::bind 또는 lambda를 사용해야합니다 같은 일을 사용할 수 없습니다
+0

try : this-> B :: * ptr – lucasg

+0

'this -> * ptr'은 당신이 생각하는대로하지 않기 때문에 작동하지 않습니다. 'this'를 묶어 정규 함수 포인터를 생성하지 않습니다. 법적 구문이 아닙니다. – StoryTeller

+0

'B' 객체에 대한 참조를 보유하는 펑터 객체가 필요합니다. – StoryTeller

답변

3

T. std::bind

이 될 것입니다

using namespace std::placeholders; 
sort(list.begin(), list.end(), std::bind(ptr, this, _1, _2)); 
+0

나는 std :: bind에 대해 알지 못했다. 내가 필요한 것이 맞을 것 같다. 고마워. 그리고 그것은 내가 회원 함수에 대한 포인터에 대해 자세히 알아야 할 것 같습니다 :). – Azhrilla

0

이 줄 :

bool (B::*ptr)(A*,A*) = &B::Closer; 

당신이 다음에 호출하는 클래스 인스턴스를 필요로이 함수를 호출하려면 멤버 함수 B로 점을 가져옵니다 (멤버 함수는 액세스 할 수있는 클래스 데이터의 어떤 인스턴스를 알 필요가 있습니다. 예 :

(this->*ptr)(lhs, rhs) 

이 멤버 함수를 호출합니다. (이는 'anotherB'이 아니었다 가정) anotherB 사용하여 B :: 가까이 기능을하지만,이 시간을 부를 것이다

B anotherB; 
bool (B::*ptr)(A*,A*) = &B::Closer; 
(anotherB.*ptr)(lhs, rhs) 

아니라 이런 짓을하면

나는

... 무엇을 잘 모르겠어요 당신은 단지 그것을 제공 할 수 있습니다 ...
(this->*ptr) 

...는?, 위해 평가하지만 내가 문제가 당신이() 종류의 클래스 인스턴스와 멤버 함수 포인터를 줄 수 있다고 생각 문제

입니다 멤버 함수 포인터이므로이 함수를 호출 할 클래스 인스턴스가 없습니다.

ForEveR에서 제시하는 것처럼 std :: bind를 사용하면 매개 변수, hls, rhs, class-instance, member-pointer가있는 함수를 변환 할 수 있습니다. 하나는 'this'에 바인딩하고 하나는 원하는 멤버 함수에 바인딩하여 결과가 lhs와 rhs 만 필요한 함수가되도록합니다.

+0

설명 해 주셔서 감사합니다. ForEveR 내가 바인딩을 사용하여 제안 된대로 그것은 완벽하게 작동합니다 :) – Azhrilla