gpt4 book ai didi

c++ - 调用对象类型 'void (B::*)(int)' 不是函数或函数指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:41 25 4
gpt4 key购买 nike

我正在尝试将方法作为函数参数传递。这是一个简化的示例,它返回一个我不理解的编译错误

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);
}

编译时用

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

我明白了

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.

我不明白第一条错误信息。我知道我正在调用 foo 就好像它是一个静态方法,但它不是,但我不明白如何传递一个非静态方法。

最佳答案

两个问题。

  1. 要调用指向成员函数的指针,您需要首先应用指向成员访问运算符的指针,从而获得可调用表达式。然后你添加一个电话。现在碰巧 .* 的优先级低于函数调用运算符。所以第一个修复:

    (b.*fun)(i)
  2. 指向成员函数的指针只能通过在完全限定的函数名称上应用一元 & 来获得。所以第二个修复:

    a.call(&B::foo, 2);

关于c++ - 调用对象类型 'void (B::*)(int)' 不是函数或函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47904088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com