2 Stimmen

Was bedeutet das: Warnung: Konvertierung von 'void (ClassName::*)()' nach 'void (*)()'

Ich habe eine Mitgliedsfunktion in einer Klasse, die einen Rückruf hat, aber der Rückruf ist nicht unbedingt notwendig, so dass es einen Standardrückruf hat, der leer ist. Es scheint gut zu funktionieren, aber ich bekomme eine lästige Warnung:

warning: converting from ‘void (ClassName::*)()’ to ‘void (*)()’

Ich versuche herauszufinden, was es bedeutet und wie man es ausschalten kann (oder es reparieren, wenn ich wirklich etwas falsch mache). Hier ist ein einfacher Code:

class ClassName{
public:
    void doSomething(void (*callbackFunction)() = (void(*)()) &ClassName::doNothing){
        callbackFunction();
    }
    void doNothing(){}
};

int main(){
    ClassName x;
    x.doSomething();
    return 0;
}

Hinweis: Wenn ich dies tue (ohne es explizit als void(*)() ):

void doSomething(void (*callbackFunction)() = &ClassName::doNothing)

Ich verstehe das:

main.cpp:3: error: default argument for parameter of type ‘void (*)()’ has type ‘void (ClassName::*)()’

5voto

Mark Rushakoff Punkte 236626

Das Problem ist, dass Sie einen Zeiger auf eine instancia Methode und nicht eine statische Methode. Wenn Sie eine doNothing eine statische Methode (d.h. kein implizites Instanzargument), verschwindet die Warnung.

Konkret,

warning: converting from ‘void (ClassName::*)()’ to ‘void (*)()’

besagt genau, dass es von einer Mitgliedsfunktion der Klasse ClassName in eine Nicht-Mitgliedsfunktion konvertiert wird.

Siehe auch die C++ FAQ Lite Eintrag zu Zeigern auf Mitgliedsfunktionen und Zeigern auf Funktionen .

2voto

Nikolai Fetissov Punkte 79627

Ein Zeiger auf eine freie Funktion ist nicht dasselbe wie ein Zeiger auf eine Klassenmitgliedfunktion, die eine Instanz der Klasse am Aufrufort erfordert. Eine statische Mitgliedsfunktion ist jedoch ausreichend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X