2016-05-23 3 views
0

set<int>をクラスのメンバーとして宣言したいと思います。その内部にクラスインスタンスフィールドを使用するカスタムコンパレータを渡したいと思います。このようなメンバーフィールドを使用するC++セットコンパレータ

何か:これはエラーになります

class MyClass { 
    public: 
    MyClass() : my_set(fn_pt) {} 
    std::vector<int> blocks; 
    bool comp(int lhs, int rhs) { 
     return blocks[lhs] < blocks[rhs]; 
    } 
    bool(*fn_pt)(int,int)=comp; 
    std::set<int, bool(*)(int,int)> my_set; 
}; 

error: cannot convert ‘MyClass::comp’ from type ‘bool (MyClass::)(int, int)’ 
to type ‘bool (*)(int, int)’ 
bool(*fn_pt)(int,int)=comp; 

どのように私はそれが仕事を得ることができますか? ありがとう

答えて

3

状態がエラーMyClass::compの場合、bool (MyClass::)(int, int)ではなく、bool (*)(int, int)です。

あなたが実際にメソッドstaticを作り、thisを使用するようにソリューションではありません、あなたの代わりに、驚くばかりの感謝を

std::set<int, std::function<bool(int, int)>> my_set; 

、その後

MyClass() : my_set([this](int lhs, int rhs) { return blocks[lhs] < blocks[rhs]; }) {} 
+0

を行うことができます!私は今、同じことをする別の方法を見つけました(同様の考え方ですが、構造体を使用します):http://stackoverflow.com/questions/27467980/how-to-define-a-stdset-sorting-on-another-class- data-member?rq = 1 –

+1

このクラスの値のセマンティクスは、このような設定で壊れています。 –

+0

@BenjaminLindleyあなたは精巧にお聞かせください、私は分かりません。どのような代替案を提案しますか?ありがとう –

関連する問題