我正在尝试使用键作为“KEYWORD”创建一个stl映射,并将值作为“类成员函数”但是它没有被编译。 以下是代码。任何人都可以告诉我有什么问题。类成员函数不是静态的。
typedef void (RemoteHostManager::*CmdHandlerPtr)(char *);
typedef std::map<char *,CmdHandlerPtr> CommandHandlerSet;
typedef std::map<char *,CmdHandlerPtr>::iterator CommandHandlerSetItr;
void RemoteHostManager::InitializeCmdHandlerMap()
{
m_CommandSet["HELP"] = &RemoteHostManager::usage;
m_CommandSet["CONNECT"] = &RemoteHostManager::Connect;
m_CommandSet["READ"] = &RemoteHostManager::Read;
m_CommandSet["WRITE"] = &RemoteHostManager::Write;
m_CommandSet["STOP"] = &RemoteHostManager::Stop;
m_CommandSet["START"] = &RemoteHostManager::Start;
}
以下是错误:
RemoteHostManager.cpp: In member function `void
RemoteHostManager::InitializeCmdHandlerMap()':
RemoteHostManager.cpp:14: no match for `std::_Rb_tree_iterator<std::pair<const
std::string, void (RemoteHostManager::*)(char*)>, std::pair<const
std::string, void (RemoteHostManager::*)(char*)>&, std::pair<const
std::string, void (RemoteHostManager::*)(char*)>*>& [const char[5]]'
operator
//similar error for other assignments!
答案 0 :(得分:3)
typedef std::map<char *,CmdHandlerPtr> CommandHandlerSet;
typedef std::map<char *,CmdHandlerPtr>::iterator CommandHandlerSetItr;
首先制作const char*
,或者更好std::string
:
typedef std::map<std::string,CmdHandlerPtr> CommandHandlerSet;
typedef std::map<std::string,CmdHandlerPtr>::iterator CommandHandlerSetItr;
请注意,您的所有成员函数都应与CmdHandlerPtr
的类型相匹配。也就是说,参数类型必须为char*
,返回类型必须为void
。
使用地图时,您需要一个RemoteHostManager
类型的实例:
RemoteHostManager instance;
string key;
//...
(instance.*m_CommandSet[key])(param);
答案 1 :(得分:1)
如果类成员函数不是静态的,则需要在映射中将该方法与实例绑定。您可以使用boost :: bind来执行此操作。