11
struct B
{
  void (B::*pf)(int, int);  // data member
  B () : pf(&B::foo) {}
  void foo (int i, int j) { cout<<"foo(int, int)\n"; } // target method
};

int main ()
{
  B obj;
  // how to call foo() using obj.pf ?
}

上記のテストコードでpfは、はのデータメンバーですB。それを呼び出すための文法規則は何ですか?簡単なはずですが、適切に一致していません。たとえば、試してみるとobj.*pf(0,0);、次のようになります。

error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
4

3 に答える 3

14

このような:

(obj.*obj.pf)(0, 1);

メンバー アクセス ( .) は、メンバー演算子へのポインターよりも優先順位が高いため、これは次のようになります。

(obj.*(obj.pf))(0, 1);

関数呼び出しもメンバー演算子へのポインターよりも優先順位が高いため、次のことはできません。

obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)

それは次と同等です:

obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
                    // pointer to member
于 2011-06-11T15:33:00.693 に答える
5

pf はメソッドポインターであり、それが指すメソッドを呼び出したいので、使用する必要があります

(obj.*obj.pf)(1, 2);

pfが指すメソッドを呼び出すオブジェクトobjを示します

ここで結果を参照してください:

http://ideone.com/p3a5G

于 2011-06-11T15:33:42.080 に答える
5

構文はかなり不自然ですが、C++ の優先順位規則の結果です...

(obj.*obj.pf)(1, 2);
于 2011-06-11T15:36:28.460 に答える