2009-04-01 8 views
18

오버로드 된 특정 멤버 함수에 대한 포인터를 얻으려고 시도 중입니다. 멤버 함수입니다. 여기에 예제 :오버로드 된 멤버 함수의 주소를 얻는 방법은 무엇입니까?

class C 
{ 
    bool f(int) { ... } 
    bool f(double) { ... } 

    bool example() 
    { 
    // I want to get the "double" version. 
    typedef bool (C::*MemberFunctionType)(double); 
    MemberFunctionType pointer = &C::f; // <- Visual C++ complains 
    } 
}; 

오류 메시지는 "오류 C2440 : '초기화': 'MemberFunctionType'에 '오버로드 기능'에서 변환 할 수 없습니다"

f가 과부하되지 않은 경우 작동

있지만 위의 예에서. 어떠한 제안?

편집은 위의 코드를 나는 "CONST"잊고 있었던 것이 었습니다 나의 현실 세계의 문제를 반영하지 않았다주의 -이 허용 대답이 지적하는 것이다. 문제는 다른 사람들에게도 일어날 수 있다고 생각하기 때문에 나는 그대로 질문을 떠날 것입니다.

+0

빠른 테스트를 수행했으며 모든 것이 컴파일됩니다. 코드가 정상적으로 보입니다 - 이것이 원래 코드 인 경우 : D 또한 정확히 그 const-ness를 가지고 있습니까? –

+0

어떤 버전의 MSVC를 사용하고 있습니까? 그것은 2008 년에 잘 작동합니다. – Eclipse

+0

물론. 나는 큰 즐거움을 누릴 것이다 : p –

답변

27

글쎄, 나는 그것이 이미 받아 들일 수 있도록 내가 코멘트로 넣었던 것에 대답 할 것이다. 문제는 const와 함께 :

class C 
{ 
    bool f(int) { ... } 
    bool f(double) const { ... } 

    bool example() 
    { 
    // I want to get the "double" version. 
    typedef bool (C::*MemberFunctionType)(double) const; // const required! 
    MemberFunctionType pointer = &C::f; 
    } 
}; 

명확화 :

원래 질문은 const 것을 포함되지 않았다. 나는 그가 실제 코드에서 const 멤버 함수 인 f이 있는지 여부에 대한 논평에서 야생 추측을 수행했다. (왜냐하면 아직 초기 반복에서 실제 코드와 다른/누락 된 것이 판명 되었기 때문이다 : p). 그는 실제로 그것이 const 멤버 함수가되고, 대답을 게시해야한다고 말했습니다.

+1

const 포인터를 선언해야하는 이유는 무엇입니까 ?? –

+0

혼란스럽게해서 죄송합니다. 내 대답이 업데이트되었습니다. –

+1

놀라운 답변입니다. 이것은 MY 코드에서도 정확한 문제였습니다. 당신이 추측에 따라 진단했다고 미친. – Raptormeat