我收到以下錯誤:
- “<”:非法,左運算元的型別為“const_Ty”
- '>: 非法,右運算元的型別為 'const_Ty'
在下面的代碼中。
它是函式指標映射上的一個相對簡單的迭代器,其中函式的形式為void (Game::*)(UINT)。我根據浮點數檢查該值,然后運行該函式。問題似乎出問題了for,盡管我在其他地方還有另一個基本相似的 for 回圈,它可以正常作業。
using FuncPtr = void (Game::*)(UINT);
std::map<FuncPtr, float> funcDelayedTriggerMap;
void Game::PollProcessDelayedTriggers()
{
for (std::map<FuncPtr, float>::iterator it = funcDelayedTriggerMap.begin(); it != funcDelayedTriggerMap.end(); it)
{
float currentS = m_timer.GetElapsedSeconds();
if (it->second < currentS)
{
(this->*(it->first))(UINT_MAX);
funcDelayedTriggerMap.erase(it->first);
}
}
}
uj5u.com熱心網友回復:
成員函式指標不實作 operator<,這是默認的排序函式std::map使用。
成員函式指標僅實作 operator== 和 operator!= 。
解決此問題的一種簡單方法是擁有一個單獨的鍵并將函式指標放入映射的值中,例如:
std::map<int, std::pair<FuncPtr, float>>
或者,如果您不需要快速查找std::map,一個簡單的向量也可以:
std::vector<std::pair<FuncPtr, float>>
另一種方法是使用函式指標型別作為鍵:
using FuncPtr = void (Game::*)(int);
// Just a helper to get a unique type for each function pointer
template<FuncPtr ptr>
struct Tag {};
struct DelayedTrigger {
FuncPtr ptr;
float value;
DelayedTrigger() : ptr(nullptr), value(0.0f) {}
DelayedTrigger(FuncPtr _ptr, float _value) : ptr(_ptr), value(_value) {}
};
std::map<std::type_index, DelayedTrigger> funcDelayedTriggerMap;
void Game::PollProcessDelayedTriggers()
{
for (std::map<std::type_index, DelayedTrigger>::iterator it = funcDelayedTriggerMap.begin(); it != funcDelayedTriggerMap.end(); it)
{
float currentS = 1.0;
if (it->second.value < currentS)
{
(this->*(it->second.ptr))(0);
funcDelayedTriggerMap.erase(it->first);
}
}
}
這實質上使用特定的函式指標作為唯一鍵。
然后,您可以像這樣添加新條目:
funcDelayedTriggerMap.emplace(typeid(Tag<&Game::DoIt>), DelayedTrigger{&Game::DoIt, 1.0f});
// or
funcDelayedTriggerMap[typeid(Tag<&Game::DoIt>)] = {&Game::DoIt, 1.0f};
并檢查函式是否存在:
if(funcDelayedTriggerMap.contains(typeid(Tag<&Game::DoIt>))) {
// ...
}
但是,這僅在您知道要在編譯時與地圖一起使用的所有函式時才有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329562.html
標籤:C
