2016-12-25 12 views
-1

を関数ポインタを呼び出そうとするとき、私はC++のメンバ関数への関数ポインタを使用してメンバ関数を呼び出す必要があるが、私はここでガットは、メンバ関数への

te5.cc:22:14: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘fp (...)’, e.g. ‘(... ->* fp) (...)’ 
    b.*fp(100); 

エラーをコンパイルしましたエラーをコンパイルしたコードスニペットです。どのようにそれを動作させるためにどのようなアイデア?

#include <stdio.h> 
#include <string> 
#include <stdio.h> 
#include <string.h> 

class A { 
public: 
    void dum1(int a) { printf("A::dum1(%d)\n", a);} 
    virtual void dum(int a) { printf("A::dum(%d)\n", a);}; 
}; 
class B : public A { 
public: 
    B() { 
    } 
    void dum(int a) { printf("B::dum(%d)\n", a);} 
}; 
typedef void (A::*RUNFUNC)(int a); 
RUNFUNC fp = &A::dum; //, &A::dum}; 

int main (int argc, char *argv[]) { 
    B b; 
    b.*fp(100); 
    return 0; 
} 
+0

「実際には何ですか? –

+0

それはちょうど整数です。特別な意味はありません。 – packetie

+0

'RUNFUNC'は何を期待していますか? –

答えて

4
b.*fp(100); 

間違った構文、

(b.*fp)(100); 
+0

ありがとう@artm、それは動作します!ありがとう。 – packetie

3

演算子の優先順位は、メンバへのポインタの適用の前後に括弧を挿入する必要があります(.*()よりも低い優先順位を持っているので)それがあるべきであり、それはです呼び出し。このように:

(b.*fp)(100); 

そうでない場合、それはb.*(fp(100))として解析されます。 Silly, but those are the rules

+0

ありがとう。私は愚かな何かを逃したと信じられない:-) – packetie

関連する問題