문제

이해가 안되는 컴파일 오류 (MS VS 2008)를 받고 있습니다. 몇 시간 동안 그것을 엉망으로 만든 후에, 그것은 모두 흐릿하며, 내가 놓친 것이 매우 분명하고 아주 어리석은 것이 있다고 생각합니다. 필수 코드는 다음과 같습니다.

typedef int (C::*PFN)(int);

struct MAP_ENTRY
    {
    int id;
    PFN pfn;
    };

class C
    {
    ...
    int Dispatch(int, int);
    MAP_ENTRY *pMap;
    ...
    };

int C::Dispatch(int id, int val)
    {
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
        {
        if (p->id == id)
            return p->pfn(val);  // <--- error here
        }
    return 0;
    }

컴파일러는 화살표가 "용어가 1 인수를 취하는 함수로 평가하지 않는다고 주장한다"고 주장한다. 왜 안 돼? PFN은 하나의 인수를 취하는 함수로 프로토 타입으로, Map_entry.pfn은 PFN입니다. 내가 여기서 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

p->pfn 포인터 투 관련 기능 유형의 포인터입니다. 이러한 포인터를 통해 함수를 호출하려면 어느 작업자를 사용해야합니다. ->* 또는 연산자 .* 유형의 객체를 제공합니다 C 왼쪽 피연산자로. 당신은하지 않았습니다.

나는 어떤 유형의 객체를 모른다 C 여기서 사용해야합니다. 할 수 있습니다 *this. 이 경우 통화는 다음과 같이 보일 수 있습니다

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

약간 덜 복잡하게 보이게하려면 중간 변수를 소개 할 수 있습니다.

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

다른 팁

노력하다

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

내 자신의 경험을 쌓기 위해, 나는이 진술로 인한 G ++의 오류를 발견했습니다.

  (this -> *stateHandler)() ;

여기서 StateHandler는 *this에 의해 참조 된 클래스의 무효 멤버 함수에 대한 포인터입니다. 문제는 화살표 연산자 사이의 공간으로 인해 발생했습니다. 다음 스 니펫은 잘 컴파일합니다.

(this->*stateHandler)() ;

G ++ (GCC) 4.4.2 20090825 (Prerelease)를 사용하고 있습니다. fwiw.

p-> pfn은 함수 포인터입니다. 기능을 만들려면 * 사용해야합니다. 로 변경

(*(p->pfn))(val)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top