首页 > 解决方案 > 在具有全局 typedef 的类中使用成员函数指针

问题描述

我在该行收到编译器错误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;
}

标签: c++typedefpointer-to-member

解决方案


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

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


推荐阅读