C ++函数指针映射与类成员变量

时间:2011-01-18 06:38:31

标签: c++

我正在尝试使用键作为“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!

2 个答案:

答案 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来执行此操作。