我使用STL find_if
编写了一个类方法。代码如下:
void
Simulator::CommunicateEvent (pEvent e)
{
pwEvent we (e);
std::list<pEvent> l;
for (uint32_t i = 0; i < m_simulatorObjects.size (); i++)
{
l = m_simulatorObjects[i]->ProcessEvent (we);
// no action needed if list is empty
if (l.empty ())
continue;
// sorting needed if list comprises 2+ events
if (l.size () != 1)
l.sort (Event::Compare);
std::list<pEvent>::iterator it = m_eventList.begin ();
std::list<pEvent>::iterator jt;
for (std::list<pEvent>::iterator returnedElementIt = l.begin ();
returnedElementIt != l.end ();
returnedElementIt++)
{
// loop through the array until you find an element whose time is just
// greater than the time of the element we want to insert
Simulator::m_eventTime = (*returnedElementIt)->GetTime ();
jt = find_if (it,
m_eventList.end (),
IsJustGreater);
m_eventList.insert (jt, *returnedElementIt);
it = jt;
}
}
}
不幸的是,我后来发现运行代码的机器配备了libstdc ++库版本4.1.1-21,显然缺少find_if
。毋庸置疑,我不能升级图书馆,也不能让别人去做。
编译时,我得到的错误是:
simulator.cc: In member function ‘void sim::Simulator::CommunicateEvent(sim::pEvent)’:
simulator.cc:168: error: no matching function for call to ‘find_if(std::_List_iterator<boost::shared_ptr<sim::Event> >&, std::_List_iterator<boost::shared_ptr<sim::Event> >, sim::Simulator::<anonymous struct>&)’
simulator.cc: In static member function ‘static void sim::Simulator::InsertEvent(sim::pEvent)’:
simulator.cc:191: error: no matching function for call to ‘find_if(std::_List_iterator<boost::shared_ptr<sim::Event> >&, std::_List_iterator<boost::shared_ptr<sim::Event> >, sim::Simulator::<anonymous struct>&)’
make: *** [simulator.o] Error 1
我该如何解决这个问题?
我认为我可以按照here所述定义find_if
函数。但是,我有一些担忧:
您对此有何看法? TIA, JIR
在IsJustGreater
类之外定义Simulator
并宣布IsJustGreater_s
的{{1}}朋友:
Simulator
以这种方式在struct IsJustGreater_s : public std::unary_function<const pEvent, bool> {
inline bool operator() (const pEvent e1) {return (e1->GetTime () > Simulator::m_eventTime);}
} IsJustGreater;
中调用IsJustGreater
:
jt = find_if(it,m_eventList.end(),sim :: IsJustGreater);
答案 0 :(得分:3)
从错误中,您似乎尝试使用匿名类型作为参数。我不认为匿名类型是模板参数。
从错误中,我相信你有这样的事情:
class Simulator {
struct {
bool operator(const pEvent& p) { ... } ;
} IsJustGreater;
}
你想要的是给它一个名字,然后改变find_if来实例化这个类(见下文)
class Simulator {
// class is now an inner named-class
struct IsJustGreater {
bool operator(const pEvent& p) { ... } ;
};
}
// This is how you use the class
jt = std::find_if(it, m_eventList.end(), IsJustGreater() );
答案 1 :(得分:1)
我发现您在std::
之前使用的是std::list
限定符,而不是std::find_if
。尝试将std::
放在前面,以便编译器可以在命名空间中找到它。