Rem*_*i.b 4 c++ function parameter-passing
我试图将传递方法作为函数参数包裹起来.这是一个简单的示例,它返回我不理解的编译错误
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);
}
Run Code Online (Sandbox Code Playgroud)
编译时
g++ -std=c++11 b.cpp -o b
Run Code Online (Sandbox Code Playgroud)
我明白了
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.
Run Code Online (Sandbox Code Playgroud)
我不明白第一条错误消息.我知道我在调用foo它就好像它是一个静态方法,它不是,但我不明白如何传递一个非静态方法.
两个问题.
要调用指向成员函数的指针,首先需要应用指向成员访问运算符的指针,该指针获取可调用表达式.然后你添加一个电话.现在它发生.*的优先级低于函数调用运算符.所以第一个修复:
(b.*fun)(i)
Run Code Online (Sandbox Code Playgroud)只能通过&在完全限定的函数名称上应用一元来获取指向成员函数的指针.所以第二个修复:
a.call(&B::foo, 2);
Run Code Online (Sandbox Code Playgroud)