2016-10-13 10 views
1

メンバー関数をネストされたクラスの別の関数に渡そうとしています。C++非静的メンバー関数のバインド

非メンバ関数がうまく動作しますが、メンバーを渡すと、コンパイルされません渡す:

ああ:
class A 
{ 
    class B 
    { 
     B(); 
     ~B(); 
     doSomething(); 
    }; 

    class C 
    { 
     C(); 
     ~C(); 
     execute(function<void(void)> func); 
    }; 

    C *myC; 
    map<int, B> myMap; 
} 
A.cpp:
void A::member(int param) 
{ 
    A::myMap[param].doSomething(); 
} 

void nonA_func(int param) 
{ 
    ... 
} 

void A::caller() 
{ 
    myC->execute(bind(nonA_func, 42)); // OK 
    myC->execute(bind(A::member, 42)); // COMPILER ERROR 1 

    myC->execute(A::myMap[42].doSomething()); // COMPILER ERROR 2 
} 

A::main() 
{ 
    myC = new A::C(); 
    // filling myMap 

    caller(); 

    myMap.clear(); 
    delete C; 
} 

次のようにコンパイルする場合COMPILER ERROR 1が発生しました:

実際に staticとして A::memberを定義

は、この問題を解決するが、その後、私はもうmyMapにアクセスすることはできません。 非静的メンバー関数をどのようにバインドできますか?


私もCOMPILER ERROR 2その結果、直接呼び出される関数を渡すことを試みた:

invalid use of void expression 
    myC->execute(A::myMap[42].doSomething()); 
            ^
+1

「実行しない(関数 func; 'が欠落しています)'はありませんか?私が推測しているのは... – urban

+0

サイドノート: 'bind'は恐ろしいですが、可能であればlambdaを避けてください。確かにここで可能です。 –

+0

@VioletGiraffeはひどい*過言ではありませんか? – krzaq

答えて

3

あなたはbind(またはラムダ)へthisのポインタを渡す必要があります。インスタンスなしでインスタンス変数/関数を使用することはできません。

myC->execute(bind(&A::member, this, 42)); 
myC->execute([this]{ member(42); }); 
+0

それは本当に良い答えです、ありがとう!両方とも正常に動作しています。 – Corbie

+0

「42」が変数(「i」のような)であった場合、ラムダ項は 'myC-> execute([this、i] {member(i);});' – Corbie

関連する問題