在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;
}
答案 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
。