【问题标题】:Using a member function pointer within a class with global typedef在具有全局 typedef 的类中使用成员函数指针
【发布时间】:2018-10-13 19:41:51
【问题描述】:

我在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;
}

【问题讨论】:

  • 它们是两种不同的类型:指向函数的指针和指向类方法的指针。您只能将指针分配给相同类型的另一个指针。这与尝试将指向 int 的指针分配给指向 char 的指针没有什么不同。
  • 嗨,欢迎来到 stackoverflow!请确保在提问之前搜索您的问题,网站上已经有几个关于指向成员函数的指针的问题。快乐编码:)
  • 只是一些附带的建议:在现代 C++ 中,using 应该优于 typedef(它更灵活,恕我直言,语法更清晰)。
  • 很好的阅读主题:Pointers to Member Functions.

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 2014-11-12
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多