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) (...)’
答案 0 :(得分: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
答案 1 :(得分:5)
答案 2 :(得分:5)
语法非常不自然,但是C ++优先级规则的结果......
(obj.*obj.pf)(1, 2);