代码之家  ›  专栏  ›  技术社区  ›  Brendan Long

这意味着什么:警告:从void(classname::*)()转换为void(*)

  •  2
  • Brendan Long  · 技术社区  · 14 年前

    我在一个有回调的类中有一个成员函数,但是回调并不是绝对必要的,所以它有一个默认回调,它是空的。它似乎工作得很好,但我得到了一个恼人的警告:

    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 回复  |  直到 14 年前
        1
  •  5
  •   Mark Rushakoff    14 年前

    问题是,您正在将指针传递给 实例 方法而不是静态方法。如果你 doNothing 静态方法(意味着没有隐式实例参数),警告消失。

    明确地,

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

    确切地说,它正在从类classname的成员函数转换为非成员函数。

    参见C++ FAQ Lite entry about pointers to member functions and pointers to functions .

        2
  •  2
  •   Nikolai Fetissov    14 年前

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