2012-03-03 73 views
0

所以我有一個任務要求我使用隨機快速排序,並發現使用函數指針的問題。C++函數指針;沒有匹配的功能

排序功能是rqs.cpp

template <typename Item_Type> 
void rqs_with_range(std::vector<Item_Type> &vec, int p, int q, 
       int (*cmp)(Item_Type, Item_Type)); 

然後在我的cpp文件,我有這樣的事情:

class Table{ 
    constructor.... 
    vector< vector<string>* >* holder; // table 
    int compare_str(vector<string>* a, vector<string>* b) { 
     return a->at(compare_column) < b->at(compare_column) ? -1 :a->at(compare_column) == b->at(compare_column) ? 0 : 1; 
    } 

    void rqs{ 
     rqs_with_range((*holder) , 1, int(holder->size()-1), &Table::compare_str); 
    } 
} 

編譯器說,我在功能rqs有錯誤,沒有匹配的功能。我的比較函數是Table的成員函數,會不會是問題的原因?

+1

成員函數不是函數,指向成員函數不是函數指針。搜索這個網站,因爲這已經被問過一百萬次了。 – 2012-03-03 18:07:19

回答

1

是的,這是一個問題。

你可以讓它成爲一個自由函數或靜態成員。否則,您將有一個隱藏的this參數影響函數簽名。

0

如果您已經在使用模板,請不要使用函數指針。用一個函數對象,而不是:

template <typename Item_Type, typename Compare> 
void rqs_with_range(std::vector<Item_Type> &vec, int p, int q, Compare comp); 

那麼接下來的問題:請compare_str不是一個非靜態成員函數,即表類之外的功能。通過修改rqs_with_range,你也可以用std :: mem_fun或std :: bind來解決你的問題,但這沒有任何意義。