2016-12-26 1 views
2

Ich folge diesem example. Aber wenn ich kompilieren, gibt es eine Fehlermeldung:Ungültige Verwendung der nicht statischen Elementfunktion C++

Invalid use of non-static member function

an der Linie

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

Ich versuchte static-void on(); auf Klasse hinzufügen

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

Aber es beklagt, dass

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

Kannst du mir helfen, das Problem zu beheben?

Antwort

5

Im Gegensatz zu statischen Elementfunktionen oder freien Funktionen, werden nicht-statische Elementfunktionen nicht an implicitly convert Mitgliedsfunktionszeiger übergeben.

(Hervorhebung von mir)

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.

So müssen Sie & verwenden ausdrücklich die Adresse der nicht-statische Member-Funktionen zu übernehmen (das heißt bekommen nicht-statische Member-Funktionszeiger). z.B.

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

Wenn Sie sie als statische Member-Funktion deklarieren, sollten Sie die Art der ptrs ändern (auf Anordnung von Drittfunktionszeiger). Beachten Sie, dass es für die statische Elementfunktion sinnvoll ist, & nicht explizit zu verwenden. z.B.

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

Ah, oui. Es funktioniert, aber können Sie bitte erklären warum? Danke – GAVD

+0

@GAVD Erläuterung hinzugefügt. – songyuanyao

+0

@songyuanyao die pcap_loop() unter pcap-Bibliothek wirft einen ähnlichen Fehler. Könnten Sie sich das bitte ansehen und mich wissen lassen, wenn Sie eine Idee haben? Tqvm http://stackoverflow.com/questions/43108998/c-pcap-loop-arguments-issue – Wei

Verwandte Themen