无效使用非静态成员函数c ++

时间:2016-12-26 04:16:53

标签: c++ function-pointers member-function-pointers

我正在关注此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

你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

与静态成员函数或自由函数不同,非静态成员函数不会成为implicitly convert成员函数指针。

(强调我的)

  

函数类型T的左值可以隐式转换为该函数的prvalue指针。 这不适用于非静态成员函数,因为引用非静态成员函数的左值不存在。

因此,您需要显式使用&来获取非静态成员函数的地址(即获取非静态成员函数指针)。 e.g。

void(Machine:: *ptrs[])() = 
  {
    &Machine::off, &Machine::on
  };

如果将它们声明为静态成员函数,则应更改ptrs的类型(到非成员函数指针数组)。请注意,对于静态成员函数,可以明确地不使用&。 e.g。

void(*ptrs[])() = 
  {
    Machine::off, Machine::on
  };