禁用"错误功能强制转换"警告

fun*_*lic 10 c++ compiler-warnings

我收到以下警告:

warning: converting from 'void (MyClass::*)(byte)' to 'void (*)(byte)'
Run Code Online (Sandbox Code Playgroud)

这是因为我需要将成员函数而不是普通函数作为参数传递.但程序运行正常.

我想禁用此警告(Wno-bad-function-cast不适用于C++)或实现传递成员函数的不同方法.

iam*_*ind 16

.严肃对待此警告.您应该更改代码以处理此方案.

成员函数(void (MyClass::*)(byte))和普通函数指针(void (*)(byte))的指针完全不同.看到这个链接.你不能像那样抛弃它们.它会导致未定义的行为或崩溃.

看到这里,他们是如何不同的:

void foo (byte); // normal function
struct MyClass {
  void foo (byte); // member function 
}
Run Code Online (Sandbox Code Playgroud)

现在您可能会感觉到foo(byte)并且MyClass::foo(byte)具有相同的签名,那么为什么它们的函数指针不相同.这是因为,MyClass::foo(byte)某种程度上内部解决了,

void foo(MyClass* const this, byte);
Run Code Online (Sandbox Code Playgroud)

现在你可以闻到它们之间的区别.

声明指向成员函数的指针为,

void (MyClass::*ptr)(byte) = &MyClass::foo;
Run Code Online (Sandbox Code Playgroud)

你必须将它ptr与对象一起使用MyClass,例如:

MyClass obj;
obj.*ptr('a');
Run Code Online (Sandbox Code Playgroud)