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-主義。寧可讓它空,除非你想看看真的老了。)