3

我想传递我的函数repaint()在3个版本中重载的函数指针。我想通过一个不带任何参数:传递一个重载成员函数的函数指针?

void repaint() 

我想:

myObject = new Object(&myclass::repaint); 

但是编译器说:“我不知道是哪个版本的选择”。好。

然后我试图

myObject = new Object(static_cast<void(*)(void)>(&repaint); 

然后我得到了(对不起,坏的翻译):

  • “无效操作上绑定的成员函数的表达式”
  • “myObject的:: myObject没有重载函数接受3个参数“

如何正确传递它?

+0

1.是否有可能发布'对象:对象的签名(...)' 2.似乎你的'static_cast'行中有一个输入错误,''''在';'之前缺少''''? –

+0

[C++重载的方法指针]的可能重复(http://stackoverflow.com/questions/4364599/c-overloaded-method-pointer) – Oktalist

回答

3

成员函数指针和非成员函数指针不是一回事。类型代码中的成员函数指针是不正确的,将其更改为

myObject = new Object(static_cast<void(myclass::*)()>(&myclass::repaint); 
             ~~~~~~~~~ 

BTW:在参数列表中的void是多余的。

+0

好的!谢谢!似乎现在被正确地传递,但看起来,我的构造函数是不好定义的:“void(__cdecl *)(void)”不可能“中的参数4的转换”void(__thiscall Status :: *)(void)“。我的构造函数是这样的:Object(void(* repaintFCT)(void)); – Christoph

+0

@Christoph看起来构造函数的参数类型也不正确。它应该像'void(myclass :: * sth)()',即'void(Status :: * repaintFCT)()'为你的真实代码。顺便说一句:你可能需要修复很多东西,比如成员变量的类型等等。 – songyuanyao

+0

好的。但是构造器不知道类myclass。内部类不能包含外部类定义outer_class.h。或者我错了? – Christoph

2
  1. 由于某种原因,您删除了类作用域 - 使用&myclass::repaint获取指向成员的指针,就像在第一个代码中一样。
  2. 成员函数的类型是void (myclass::*)()
    所有指向成员的指针都指定类。

(参数列表(void)是C-主义。宁可让它空,除非你想看看真的老了。)