2013-09-23 4 views
1

몇 가지 코드 :전달 함수 포인터 X 인수 여기

// Unit.h 
typedef void (IInteractable::*fPtr)(Player&); 
typedef std::vector<std::pair<std::string, fPtr>> Actions; 


// Unit.cpp 
Actions Unit::getActions() 
{ 
    Actions a; 
    a.push_back(make_pair("Attack", &Unit::attack)); 
    return a; 
} 
void attack(Player& p) 
{ 
    cout << "Attack!" << endl; 
} 

그리고 내가 뭘 얻을 것은 이상한 원인 단위 IInteractable에서 상속 보인다 error: no matching function for call to ‘std::vector<std::pair<std::basic_string<char>, void (IInteractable::*)(Player&)> >::push_back(std::pair<const char*, void (Unit::*)(Player&)>)’이다. 이 문제를 "단순"하게 만드는 데는 시간이 걸렸지 만 다음에 무엇을해야할지 전혀 모릅니다. 누구든지 도와 줄 수 있습니까?

+0

작동하지 않습니다. 위의 예에서 문제가없는 것처럼 보입니다.하지만 누군가가 따라 오면 벡터의 요소를 꺼내서 함수 포인터를 호출합니다 (벡터의 def에 따라 * IInteractable :: *) '단위는 아니지만'IInteractable '에 무엇이 있습니까? 그때 당신은'Unit'이 아닌 무언가에 대해'Unit' 멤버 함수를 호출합니다, 그리고 그것은 * bad *입니다. 이것이 컴파일러가 원하는 것을 할 수없는 이유입니다. – us2012

+0

관련 : http://stackoverflow.com/questions/4387798/function-pointers-to-member-functions-of-a-parent-class –

답변

1

구성원이 필요한 경우 &Unit::attack이 아닌 &IInteractable::attack을 지정해야합니다. 재정의 된 파생 클래스 함수에 대한 포인터는 이러한 변환이 의미있는 것으로 예상 할지라도 기본 클래스 함수에 대한 해당 포인터로 변환되지 않습니다.

+0

"이러한 전환이 의미를 갖기를 기대할지라도." 아니, 나는 정반대가 될 것으로 기대한다. 기본 클래스 메소드에 대한 포인터는 파생 클래스 메소드에 대한 포인터로 변환 가능해야한다. – newacct

+0

@newacct : 재정의 된 파생 클래스 함수에 대한 포인터가 재정의하는 함수에 대한 포인터로 변환 될 수 있음을 이해합니다. 당신이 옳긴하지만 일반적으로 회원들에게는 이해가되지 않을 것입니다. 어쨌든 일어나지 않기 때문에 아무에게도 의미가 있는지 여부는 중요하지 않습니다. –