3

3 버전에서 오버로드 된 함수 repaint()의 함수 포인터를 전달하려고합니다.오버로드 된 멤버 함수의 함수 포인터를 전달 하시겠습니까?

void repaint() 

내가 시도 : 나는 어떤 인자가없는 한 통과 할

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

을하지만 컴파일러는 "내가 선택할 수있는 버전을 모른다"말했다. 승인.

그럼 내가 (나쁜 번역 죄송합니다) 가지고 다음

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

을 시도 :

  • "잘못된 작업 바운드 멤버 함수의 표현에"
  • "myObject에 :: myObject 오버로드 된 함수가 3 개의 인수를 허용하지 않습니다. "

올바르게 전달하는 방법은 무엇입니까?

+0

1.이'객체 : 객체의 서명을 게시 할 수 있나요 (...)' 2.'static_cast' 줄에 오타가있는 것 같아요.')'before';'? –

+0

가능한 중복 [C++ 오버로드 된 메서드 포인터] (http://stackoverflow.com/questions/4364599/c-overloaded-method-pointer) – Oktalist

답변

3

멤버 함수 포인터와 비 멤버 함수 포인터는 동일하지 않습니다. 코드에서 멤버 함수 포인터의 형식이 올바르지 않습니다, BTW

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

로 변경 : 매개 변수 목록에서 void 중복입니다.

+0

좋습니다! 감사! 이제 제대로 전달 될 것으로 보이지만 내 생성자가 잘못 정의 된 것으로 보입니다. "void (__cdecl *) (void)"에서 인수 4 "void (__thiscall Status :: *) (void)"를 변환 할 수 없습니다 ". 내 생성자는 다음과 같습니다. Object (void (* repaintFCT) (void)); – Christoph

+0

@Christoph 생성자의 매개 변수 유형이 올바르지 않은 것으로 보입니다. 실제 코드에는'void (myclass :: * sth)()', 즉'void (Status :: * repaintFCT)()'와 같은 것이어야합니다. BTW : 회원 변수 등의 유형을 많이 고쳐야 할 수도 있습니다. – songyuanyao

+0

Ok. 그러나 생성자는 클래스 myclass를 알지 못합니다. 내부 클래스는 외부 클래스 정의 outer_class.h를 포함 할 수 없습니다. 아니면 내가 틀렸어? – Christoph

2
  1. 어떤 이유에서든 클래스 범위를 삭제했습니다. &myclass::repaint을 사용하여 첫 번째 코드와 마찬가지로 멤버에 대한 포인터를 가져옵니다.
  2. 구성원 함수의 유형은 void (myclass::*)()입니다.
    모든 포인터 투 회원 유형은 클래스를 지정합니다.

은 (매개 변수 목록 (void)는 C-주의입니다. 당신은 정말 오래된보고 싶어하지 않는 한, 빈을 떠날 것을 선호합니다.)

관련 문제