2010-03-27 4 views
2

J'ai une fonction de membre dans une classe qui a un rappel, mais le rappel n » t strictement neccessary, donc il a un callback par défaut, qui est vide. Il semble fonctionner très bien, mais je reçois un avertissement gênant:Qu'est-ce que cela signifie: avertissement: la conversion de 'vide (ClassName :: *)()' à 'void (*)()'

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

J'essaie de comprendre ce que cela signifie et comment l'éteindre (ou corriger si je suis vraiment en train de faire quelque chose de mal). Voici un code simple:

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

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

Note: Si je fais ça (sans que cela coulée explicitement comme void(*)()):

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

Je reçois ceci:

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

Répondre

5

Le problème est que vous passez un pointeur vers une méthode instance plutôt qu'une méthode statique. Si vous faites doNothing une méthode statique (ce qui signifie aucun argument d'instance implicite), l'avertissement disparaît.

Plus précisément,

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

dit que c'est la conversion d'une fonction de membre de la classe ClassName, à une fonction non-membre.

Voir aussi le C++ FAQ Lite entry about pointers to member functions and pointers to functions.

+0

Ohhh. J'aurais dû penser à le rendre statique. Merci. –

2

pointeur de fonction libre est pas le même que le pointeur de la fonction de membre de classe, ce qui nécessite une instance de la classe sur le site d'appel. Bien qu'une fonction membre statique fera l'affaire.