我正在关注此example。但是当我编译时,它会返回一个错误:
无效使用非静态成员函数
在
行void(Machine:: *ptrs[])() =
{
Machine::off, Machine::on
};
我尝试在课程
中将static
添加到void on();
class Machine
{
class State *current;
public:
Machine();
void setCurrent(State *s)
{
current = s;
}
static void on(); // I add static here ...
static void off(); // and here
};
但它抱怨
在静态成员函数中无效使用成员Machine :: current
你可以帮我解决这个问题吗?
答案 0 :(得分:7)
与静态成员函数或自由函数不同,非静态成员函数不会成为implicitly convert成员函数指针。
(强调我的)
函数类型
T
的左值可以隐式转换为该函数的prvalue指针。 这不适用于非静态成员函数,因为引用非静态成员函数的左值不存在。
因此,您需要显式使用&
来获取非静态成员函数的地址(即获取非静态成员函数指针)。 e.g。
void(Machine:: *ptrs[])() =
{
&Machine::off, &Machine::on
};
如果将它们声明为静态成员函数,则应更改ptrs
的类型(到非成员函数指针数组)。请注意,对于静态成员函数,可以明确地不使用&
。 e.g。
void(*ptrs[])() =
{
Machine::off, Machine::on
};