c++ - 在具有全局 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;
}
解决方案
功能和方法不同。您不能将指向方法的指针填充到指向函数的指针中。所以
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
。
推荐阅读
- java - 为什么类型参数比方法参数强
- python - Keras 中的线性插值
- arrays - 如何在本机反应中以单独的行显示嵌套数组中的项目?
- c# - 在c#中压缩时保留文件夹权限
- terraform - 如何使 Terraform 提供程序支持导入?
- jsf - 动态primefaces menuItem不会触发命令
- excel - 使用表格中的数据在 Excel 中查找最接近的匹配项
- apache-pig - 在 GCP Dataproc 上运行 Bash 脚本
- javascript - 如何在 React.js 中将事件函数分配给 DOM 列表
- realm - SwiftUI Navigation 自动关闭/弹出 - 领域