Что это значит: предупреждение: преобразование из «void (ClassName :: *) ()» в «void (*) ()» - PullRequest
2 голосов
/ 27 марта 2010

У меня есть функция-член в классе, который имеет обратный вызов, но обратный вызов не является строго необходимым, поэтому он имеет обратный вызов по умолчанию, который является пустым. Вроде нормально работает, но я получаю досадное предупреждение:

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

Я пытаюсь выяснить, что это значит и как его отключить (или исправить, если я действительно что-то делаю неправильно). Вот простой код:

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

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

Примечание. Если я это сделаю (без явного приведения его к типу void(*)()):

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

Я получаю это:

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

Ответы [ 2 ]

5 голосов
/ 27 марта 2010

Проблема в том, что вы передаете указатель на метод instance , а не на статический метод. Если вы сделаете doNothing статическим методом (что означает отсутствие неявного аргумента экземпляра), предупреждение исчезнет.

В частности,

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

точно говорит, что он преобразуется из функции-члена класса ClassName в функцию, не являющуюся членом.

См. Также раздел C ++ FAQ Lite о указателях на функции-члены и указателях на функции .

2 голосов
/ 27 марта 2010

Указатель свободной функции - это не то же самое, что указатель на функцию-член класса, для которой требуется экземпляр класса на сайте вызова. Хотя статическая функция-член подойдет.

...