【发布时间】: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