在具有全局typedef的类中使用成员函数指针

时间:2018-10-13 19:41:51

标签: c++ typedef pointer-to-member

func = &Fred::fa;行出现编译器错误,说:

[Error] '((Fred*)this)->Fred::func' cannot be used as a member pointer

,因为它的类型为'fptr {aka double (*)(int, int)}。但是,我知道如果我将typedef定义为类中的一个类

 typedef double (Fred::*fptr)(int x, int y);

然后它将不会出错。但是我要确保typedef是在类之外定义的。

我在做什么错了?

#include <iostream>
typedef double (*fptr)(int x, int y);
class Fred
{
private:
  //typedef double (Fred::*fptr)(int x, int y);
  fptr func;
public:
  Fred() 
  {
    func = &Fred::fa;
  }

  void run()
  {
    int foo = 10, bar = 20;
    std::cout << (this->*func)(foo,bar) << '\n';
  }

  double fa(int x, int y)
  {
    return (double)(x + y);
  }        
};

int main ()
{       
  Fred f;
  f.run();
  return 0;
}

1 个答案:

答案 0 :(得分:0)

函数和方法不同。您不能将指向方法的指针填充到指向函数的指针中。所以

typedef double (*fptr)(int x, int y);

必须

typedef double (Fred::*fptr)(int x, int y);

或者您必须使用可隐藏差异的包装器,例如std::function

中缺少什么
#include <iostream>
typedef double (Fred::*fptr)(int x, int y); // Fred unknown.
class Fred
{
    ...
}

Fred的前向声明。您不能使用Fred,因为编译器不知道Fred存在。

解决方案:转发声明Fred

#include <iostream>
class Fred;
typedef double (Fred::*fptr)(int x, int y); // Fred known enough to get pointers
class Fred
{
    ...
}

但是您真正想要的是std::function