2009-06-02 5 views
3

함수 포인터를 사용하려하지만 아래 3 줄만 협조하고 싶지 않습니다 ...함수 포인터 문제

오류 코드 C3867이 표시됩니다.

내가 잘못하고있는 것을 볼 수 있습니까? 실제로

MyFuncClass->MyFunc(GetNumber(), &BigClass::PassThis, GetArgs(), TheType); 

모든 문제 점프 함수를 호출하고있어 어디 .H 파일

void MyFunc(int, FILEINFO*(*)(FILEINFO*), FILEINFO*, int); 

void MyFunc(int number, FILEINFO*(*GetFiles)(FILEINFO*), FILEINFO* args, int type); 

여기에 .cpp 파일의 정의에서

입니다 아웃?

+2

BigClass :: PassThis는 정적 함수입니다. 맞습니까? –

+0

처음으로 오류 코드를 검색했을 때의 결과 : http://msdn.microsoft.com/en-us/library/b0x1aatf(VS.80).aspx 매우 명확하게 보입니다. xD – fortran

답변

7

당신은 일반 함수 포인터와 같은 클래스의 비 정적 멤버 함수를 전달할 수 없습니다. 이에 대한 해결책은 포인터 을 첫 번째 인수로 사용하여 호출을 BigClass::PassThis으로 래핑하고 대신 해당 멤버 함수에 대한 포인터를 전달하는 정적 멤버 함수를 정의하는 것입니다. 자세한 내용은 The Function Pointer Tutorials을 참조하십시오.

더 나은 해결책은 대신에 펑터를 사용하는 것입니다.

+0

당신의 솔루션은 멋지게 작동했습니다. 감사! – samoz

+0

또한 boost :: function, boost :: bind를 살펴보고 같은 문제에 대한 다른 솔루션을 찾으십시오. –

9

BigClass::PassThis()의 정의는 무엇입니까? 정적 클래스 멤버 함수 또는 일반 멤버 함수입니까? 일반 멤버 함수 인 경우 this 매개 변수가 숨겨져 있기 때문에이를 수행 할 수 없습니다. C++ FAQ Lite의 question 33.4을 참조하십시오.

2

우리는 BigClass의 정의를 볼 필요가 있습니다. PassThis가 정적 멤버 함수가 아니라면 정규 멤버 함수를 함수 포인터로 전달할 수 없기 때문에 수행 한 작업을 수행 할 수 없습니다 (다른 것들 중에서 'this'매개 변수가 없습니다.).

2

저는 &BigClass::PassThis이 멤버 함수에 대한 포인터이며 일반 함수에 대한 포인터가 아니라고 생각합니다. 멤버 함수가 암시 적으로 이 포인터를 사용하기 때문에

+0

집에서 따라 다니는 사람들은 주목할 가치가 있습니다. 'BigClass :: PassThis'가 어떤 타입인지는 중요하지 않습니다.'BigClass :: PassThis' 타입을 사용하면 결과에 적절하게 타입이 지정된 함수에 대한 포인터를 얻을 수 있습니다. –