2013-04-30 77 views
0

致謝 我試圖在特殊對象上使用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 

我已經嘗試了一些其他的方式來得到的東西的工作,但一無所獲。

我沒有綁定到成員函數的指針,如果你有一個簡單的/不同的方式來做到這一點,歡迎你。

非常感謝,

Azhrilla

+0

嘗試:this-> B :: * ptr – lucasg 2013-04-30 11:12:04

+0

這不起作用,因爲'this - > * ptr'不能完成你認爲它的工作。它不會通過綁定this來創建常規函數指針。這甚至不是合法的語法。 – StoryTeller 2013-04-30 11:19:03

+0

您需要一個函數對象來保存對「B」對象的引用。 – StoryTeller 2013-04-30 11:20:22

回答

3

不能使用這樣的事情,你應該使用std::bindboost::bindlambda這種情況下,由於sort第三個參數應該是可調用的對象,接收類型的兩個對象T

隨着std::bind這將是

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

我不知道std :: bind,我想這正是我需要的。非常感謝。看來,我需要更多地瞭解指向成員函數的指針:)。 – Azhrilla 2013-04-30 11:25:06

0

這條線:

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

獲取一個指向成員函數B.調用這個函數,那麼你需要一個類的實例來調用它(成員函數需要知道它可以訪問的類數據的哪個conrete實例等)。例如

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

調用此成員函數。如果你沒有

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

這將使用anotherB調用B ::關於建立更緊密的功能,但這個時候,而不是這個(假設這不是「anotherB」)

我不知道什麼...

(this->*ptr) 

...評估爲?,但它的問題是

我認爲問題是,你不能給排序()類的實例和成員函數指針......你只能給它成員函數指針,所以它沒有類實例來調用這個函數。

正如ForEveR所示,您可以使用std :: bind,以便您可以從具有四個參數,hls,rhs,class-instance,成員指針的函數進行轉換。將一個'this'和一個綁定到所需的成員函數,以便結果是一個只需要lhs和rhs的函數。

+0

是的,謝謝你的解釋。正如ForEveR建議我使用綁定,它工作得很好:) – Azhrilla 2013-04-30 11:37:05

相關問題