2017-12-20 24 views
3

関数の引数としてメソッドを渡すことで頭を抱えています。ここで私はオブジェクト型 'void(B :: *)(int)'は関数または関数ポインタではありません

b.cpp:22:50: error: called object type 'void (B::*)(int)' is not a function or 
     function pointer 
     void call(void (B::*fun)(int i), int i) { b.*fun(i); } 
                ~~~^ 
b.cpp:31:12: error: call to non-static member function without an object 
     argument 
     a.call(B::foo, 2); 
       ~~~^~~ 
2 errors generated. 

を取得

g++ -std=c++11 b.cpp -o b 

でコンパイルしたとき、私は

class B 
{ 
private: 
    int j; 
public: 
    void foo(int i){std::cout << i + this->j << std::endl;} 
    void setj(int J){j=J;} 
}; 

class A 
{ 
private: 
    B b; 

public: 
    void call(void (B::*fun)(int i), int i) { b.*fun(i); } 
    void setBj(int j){b.setj(j);} 
}; 


int main() 
{ 
    A a; 
    a.setBj(40); 
    a.call(B::foo, 2); 
} 

を理解していないコンパイルエラーを返す簡単な例である私は、最初のエラーを理解していませんメッセージ。私はfooを静的メソッドと呼んでいることを理解しています。静的メソッドではありませんが、非静的メソッドを渡す方法はわかりません。

答えて

6

2つの問題。

  1. メンバー関数へのポインタを呼び出すには、まず呼び出し可能な式を取得するメンバアクセス演算子へのポインタを適用する必要があります。次に、通話を追加します。これで、.*が関数呼び出し演算子よりも優先順位が低くなります。だから、最初の修正:

    (b.*fun)(i) 
    
  2. メンバ関数へのポインタが唯一の完全修飾関数名に単項&を適用することにより得ることができます。したがって、2番目の修正:

    a.call(&B::foo, 2); 
    
関連する問題