这是什么意思:警告:从'void(ClassName :: *)()转换为'void(*)()'

时间:2010-03-27 02:50:02

标签: c++ g++ compiler-warnings

我在一个有回调的类中有一个成员函数,但回调并不是严格必要的,所以它有一个默认的回调,它是空的。它似乎工作正常,但我收到一个恼人的警告:

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 个答案:

答案 0 :(得分:5)

问题是您正在传递指向实例方法的指针而不是静态方法。如果使doNothing成为静态方法(这意味着没有隐式实例参数),警告就会消失。

具体来说,

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

确切地说它是从类ClassName的成员函数转换为非成员函数。

另请参阅C ++ FAQ Lite entry about pointers to member functions and pointers to functions

答案 1 :(得分:2)

自由函数指针与类成员函数指针不同,后者需要调用站点上的类的实例。虽然静态成员函数可以。