2013-09-23 94 views
1

下面是一些代碼:傳遞函數指針作爲矢量<對<string,X>> 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; 
} 

什麼我得到的是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&)>)’,其似乎不可思議原因單位從IInteractable繼承。我花了一些時間來解決這個問題「簡單」,但我不知道下一步該怎麼做。誰能幫忙?

+0

這是行不通的。在你的例子中,它看起來沒有問題,但是如果有人出現,就會拉出vector的一個元素並調用函數指針(根據vector的def *應該是* IInteractable :: * )在'IInteractable'而不是'Unit'上的東西?然後你在一個不是'Unit'的東西上調用'Unit'成員函數,那就是* bad *。這就是爲什麼編譯器不能讓你做你想做的事情。 – us2012

+0

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

回答

1

您需要指定&IInteractable::attack而不是&Unit::attack,其中IInteractable成員是預期的。指向重寫派生類函數的指針不會轉換爲指向基類函數的相應指針,即使人們可能期望這樣的轉換是合理的。

+0

「即使人們可能期望這樣的轉換是有道理的。」不,我期望相反的是有道理的 - 指向基類方法的指針應該可轉換爲指向派生類方法的指針。 – newacct

+0

@newacct:對我來說,重寫派生類函數的指針可能會轉換爲指向其覆蓋的函數的指針;雖然你說的對一般成員來說沒有意義。但是這對任何人來說都沒有意義,因爲它不會發生。 –

相關問題