2009-12-18 7 views
10

컴파일 오류 (MS VS 2008)가 나타납니다. 이해가 안됩니다. 여러 시간 동안 그것을 뒤범벅하고 난 후에, 그것은 모두 흐릿 해졌고, 내가 놓치고있는 아주 명백한 (그리고 매우 어리석은) 것이있는 것처럼 느껴집니다. 다음은 필수 코드입니다.멤버 함수 포인터를 호출하려면 어떻게해야합니까?

컴파일러는 "용어가 1 개의 인수를 취하는 함수로 평가되지 않습니다"라는 화살표를 사용합니다. 왜 안돼? PFN은 하나의 인수를 취하는 함수로 프로토 타입 화되며 MAP_ENTRY.pfn은 PFN입니다. 내가 여기서 무엇을 놓치고 있니?

+0

구문이 녹슬어서 대답으로 추가되지 않습니다. "return (* (p-> pfn)) (val);"이 아니어야합니다. - –

+0

아니요, "C :: PFN 유형의 피연산자에 대해 *"오류가 발생합니다. – chrisd

+0

가능한 [함수 포인터를 통해 C++ 클래스 메서드 호출] (http://stackoverflow.com/questions/1485983/calling-c-class-methods-via-a-function-pointer) –

답변

17

p->pfn로 변경 포인터 멤버 함수 타입의 포인터이다. 이러한 포인터를 통해 함수를 호출하려면 ->* 연산자 또는 .* 연산자를 사용하고 왼쪽 피연산자로 C 유형의 개체를 제공해야합니다. 너는하지 않았다. 당신 만 알고 - - 유형 C의 객체가 예상되는

나도 몰라 여기에 사용되는하지만 예제는 *this을 수 있습니다. 그것이 조금 덜 복잡한 보이게하기 위해

(this->*p->pfn)(val) 

을 다음과 같이이 경우 호출이 보일 수 있습니다, 당신은 중간

PFN pfn = p->pfn; 
(this->*pfn)(val); 
+0

감사합니다. 지금 나는 교정 만이 아니라, 왜 그런지 이해합니다. – chrisd

8

return (this->*p->pfn)(val); 
+0

예! 그게 전부 야. 정말 고마워. 너희들 믿을 수가 없어. 나는 이것을 몇 시간 동안 망쳤고 10 분 안에 답을 얻었다. – chrisd

-1

P-> PFN 함수 포인터 시도이다. 기능을 사용하려면 *를 사용해야합니다.

(*(p->pfn))(val) 
0

이 자신에게 호의를 수행하고 boost::function를 사용 변수 (부스트를 소개 할 수 :: bind도!)

+9

"내 자전거에서이 흠집은 어디에서 왔습니까?" - "자신을 호의하십시오 - 항공기를 사십시오" –

0

이 질문에 답하지 않고 boost :: function과 boost :: bind를 대신 사용해보십시오. 그것은 당신의 코드베이스에 꽤 큰 의존성을 가져 오지만, 큰 프로젝트를 위해서는 그만한 가치가 있습니다.

1

그냥 내 자신의 경험에 차임, 나는이 문장에 의한 g에 오류 ++ 건너했습니다 stateHandler는 *에 의해 참조되는 클래스의 무효 멤버 함수에 대한 포인터이다

(this -> *stateHandler)() ; 

이. 문제는 화살표 연산자 사이의 공백으로 인해 발생했습니다. 다음 스 니펫은 정상적으로 컴파일됩니다.

(this->*stateHandler)() ; 

g ++ (GCC) 4.4.2 20090825 (시험판)를 사용하고 있습니다. FWIW.