2016-12-26 12 views
2

Я следую за этим example. Но когда я компилирую, он возвращает ошибку:Недопустимое использование нестатической функции-члена C++

Invalid use of non-static member function

на линии

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 
}; 

Но он жалуется, что

Invalid use of member Machine::current in static member function

Можете ли вы помочь мне исправить это?

ответ

5

В отличие от статических функций-членов или свободных функций, нестатические функции-члены не будут implicitly convert указателям на функции-члены.

(курсив мой)

An lvalue of function type T can be implicitly converted to a prvalue pointer to that function. This does not apply to non-static member functions because lvalues that refer to non-static member functions do not exist.

Таким образом, вы должны использовать & явно взять адрес не-статических функций-членов (т.е. получить нестатические функции члена указателей). например

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

Если вы объявите их как статические функции члена, вы должны изменить тип ptrs (в массив функций, не являющихся членами указателей). Обратите внимание, что для статической функции-члена отлично не использовать & явно. например

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

Ah, oui. Это работает, но не могли бы вы объяснить, почему? Спасибо – GAVD

+0

@GAVD Пояснение добавлено. – songyuanyao

+0

@songyuanyao pcap_loop() в библиотеке pcap вызывает аналогичную ошибку. Не могли бы вы посмотреть на это и сообщить мне, если у вас есть идеи? Tqvm http://stackoverflow.com/questions/43108998/c-pcap-loop-arguments-issue – Wei

Смежные вопросы