c++ - 这是什么意思 : warning: converting from ‘void (ClassName::*)()’ to ‘void (*)()’

标签 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::*)()’

最佳答案

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

具体来说,

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

准确的说是从类ClassName的成员函数,转换为非成员函数。

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

关于c++ - 这是什么意思 : warning: converting from ‘void (ClassName::*)()’ to ‘void (*)()’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527951/

相关文章:

c++ - 从 MFC CDialog 复制文本

c++ - Code::Blocks、c++、magick++ 任何演示结果:mingw32-g++.exe: fatal error: no input files

java - 使用泛型返回列表的接口(interface)会导致警告

java - 抑制打包库中父类引起的java编译器警告

java - Idea Intellij拆箱警告似乎不是基于数据流分析

c++ - 访问指向结构中的值是否比访问本地值花费更多时间?

c++ - C++ 中 C# 'as' 命令的等价物?

c++ - 删除从 i 到行尾的字符串的一部分

c++ - 使用 opencv 和 C++ 的链接器问题 - Undefined Reference

c++ - 如何用 g++ 向量化我的循环?