2

以下は、オブジェクトのリストをフィルター処理するために使用されるファンクターです。さまざまな要素にアクセスする方法として、オブジェクトのクラスのメンバー関数へのポインターでインスタンス化する必要があります。

class Filter_Compare : public Filter {
    std::string (File::*fun)();
public:
    Filter_Compare(const char *name, const char *desc, std::string (File::*f)())
        : Filter(name, desc), fun(f)
    {}
    ~Filter_Compare() {};

    int operator () (File* f1, File* f2) { return this->eval(*f1, *f2); }
    int eval(File* f1, File* f2) const { return this->eval(*f1,*f2); }

    int eval(File& f1, File& f2) const {
        return f1.*(this->fun()).compare(f2.*(this->fun()));
    }
};
//an instanciation example :
Filter_Compare fname("Name", "Compare by name", File::getPath);

そして g++ はこれらのエラーを返します:

Filter.h: メンバー関数 'int Filter_Compare::eval(File&, File&) const': Filter.h:48:27: エラー: ' を使用する必要があります。'((const Filter_Compare*)this)->Filter_Compare::fun (...)' でメンバーへのポインタ関数を呼び出すには、' または '-> '、たとえば '(... ->* ((const Filter_Compare *)this)->Filter_Compare::fun) (...)' Filter.h:48:53: エラー: ' を使用する必要があります。'((const Filter_Compare*)this)->Filter_Compare::fun (...)' でメンバーへのポインタ関数を呼び出すには、' または '-> '、たとえば '(... ->* ((const Filter_Compare *)this)->Filter_Compare::fun) (...)'</p>

私はすでにエラーなしで別のクラスでこれを使用しているので、ここでは問題は見られません (まあ、少なくともコンパイルされましたが、今は実行できませんでした)。コードは次のとおりです。

lit_type eval(File& f) const { return f.*(this->fun()) - thValue; }

ここで何が間違っているのですか?別の方法でポインターを参照する方法がわかりません。ありがとう !

4

2 に答える 2

1

メンバー関数へのポインターを介して呼び出すには、.*またはを使用します->*。を呼び出すfunにはFile& f1、呼び出しは(f1.*fun)()です。だから:(f1.*fun)().compare((f2.*fun)())。必要のない明示的な s で式を複雑にしたい場合は、特にthis->注意する必要があります(f1.*(this->fun))().compare((f2.*(this->fun))())

于 2012-12-13T20:44:06.263 に答える
0

括弧が間違っています:

int eval(File& f1, File& f2) const {
    return (f1.*fun)().compare((f2.*fun)());
}
于 2012-12-13T21:41:02.093 に答える