以下は、オブジェクトのリストをフィルター処理するために使用されるファンクターです。さまざまな要素にアクセスする方法として、オブジェクトのクラスのメンバー関数へのポインターでインスタンス化する必要があります。
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; }
ここで何が間違っているのですか?別の方法でポインターを参照する方法がわかりません。ありがとう !