2012-03-03 28 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に一致する機能をエラーを持っていないと言います。私の比較機能はテーブルのメンバー機能です、それは問題の原因ですか?

+1

メンバ関数は関数ではなく、メンバ関数へのポインタは関数ポインタではありません。これは何百万回も尋ねられているので、このサイトを検索してください。 –

答えて

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で問題を解決することもできますが、これは意味をなさないものです。

関連する問題