2

私は次のクラスを持っています:

 class A
{
   public:
        virtual void myfunc(unsigned char c, std::string* dest) = 0;
};

   class B : public class A
{
    public:
        virtual void myfunc(unsigned char c, std::string* dest);
};

void someOtherFunc(const std::string& str,A *pointerFunc)
{
    std::string tmp;
        for_each(str.begin(),
                 str.end(),                 
                 std::bind2nd(std::mem_fun(pointerFunc->myfunc), &tmp));
}

次のコンパイルエラーが発生します:エラー:\ u2018mem_fun()\u2019の呼び出しに一致する関数がありません

なぜなのかご存知ですか?

4

4 に答える 4

1

あなたが探してstd::mem_fun(&A::myfunc)いる。

編集:mem_funここではまったく使用できません-のオーバーロードがないmem_funため、2つの引数のメンバー関数をファンクターにすることができます。/ (TR1を使用している場合)/ boost::bind( C ++ 0xを使用している場合)のようなものを使用するか、独自のファンクターを作成する必要があります。std::tr1::bindstd::bind

mem_funこの種のバインディングを実行できたとしても、ファンクターが2つの引数を取ることを期待しているstd::bind2ndため、失敗することに注意してください。このようにbind2ndメンバー関数ポインターをバインドすると、3つの引数を持つファンクターが生成されます。

これを回避する方法はいくつかあります。

  1. あなたがやりたいことをするあなた自身のファンクターを書いてください。
  2. の代わりに明示的なループを記述しますstd::for_each
  3. 私が上で述べた(そして@Davidの答えで実証された)まだ標準ではないバインダー関数の1つ
  4. そもそも仮想関数を気にしないでください。メソッドにプレーンな関数ポインターを受け入れさせ、関数ポインターの観点から実装してください。もちろん、これmyfuncは、それが属するクラスのメンバーに依存しない場合にのみ機能します(この場合、そもそもクラスに入れられるべきではありませんでした)
于 2010-12-23T15:31:27.150 に答える
0

ここで使用しようとしているのは、メンバー関数へのポインターを使用して、コンテナー内のすべてのオブジェクトに別のオブジェクトのメンバー関数を適用することです。どうやら、この場合、どのアダプターも機能しません。その場合の唯一の解決策は、そのための特別なラッパーファンクタークラスを作成することです。

于 2010-12-23T15:26:30.123 に答える
0

あなたの宣言はあなたがやりたいことを表していない。

試す:

void someOtherFunc(const std::string& str)
{
    std::string tmp;

    B BInstance;
    A* ptrToB = &BInstance;


    for_each(str.begin(),
        str.end(),                 
        boost::bind(&A::myfunc, ptrToB, _1, &tmp));
}

これ(またはのバリエーション)は、あなたが望むことをするはずです。

于 2010-12-23T15:34:17.620 に答える
0

std :: mem_funの背後にある実装を見ると、独自の実装を記述できるはずです。

編集(「人間が読める」ようにした)

template<class Result, class Ty, class Arg>
class mem_fun1_t : public binary_function<Ty*, Arg, Result>
{
private:
 Result (Ty::*m_mf)(Arg);

public:
 mem_fun1_t(Result (Ty::*mf)(Arg)) : m_mf(mf) { }

 Result operator()(Ty* pLeft, Arg Right) const {
  return ((pLleft->*m_mf)(Right));
 }
};
于 2010-12-23T15:39:15.100 に答える