2011-01-18 12 views
1

"KEYWORD"というキーと "クラスメンバー関数"の値を持つstlマップを作成しようとしていますが、コンパイルされません。 コードは次のとおりです。誰でも私に間違っていることを教えてもらえますか?クラスメンバ関数は静的ではありません。クラスメンバー変数を持つC++関数ポインターマップ

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

問題はコンパイラを取得しているか、コンパイルされていませんか? – Naveen

+0

エラーは何ですか? – Nawaz

+0

@Avinash: 'm_CommandSet'の型は何ですか?そして、行番号がどのコードに対応しているかを教えてください。ところで、マップ内で' char * 'を' std :: string'に変更しましたか? – Nawaz

答えて

3
typedef std::map<char *,CmdHandlerPtr> CommandHandlerSet; 
typedef std::map<char *,CmdHandlerPtr>::iterator CommandHandlerSetItr; 

まずそれconst char*作る、またはstd::stringさらに良い:すべてのメンバ関数がCmdHandlerPtrのタイプと一致している必要があり

typedef std::map<std::string,CmdHandlerPtr> CommandHandlerSet; 
typedef std::map<std::string,CmdHandlerPtr>::iterator CommandHandlerSetItr; 

注意。つまり、パラメータタイプはchar*で、戻りタイプはvoidである必要があります。

マップを使用する場合は、あなたがタイプRemoteHostManagerのインスタンスが必要です。クラスのメンバ関数は静的でない場合

RemoteHostManager instance; 
string key; 
//... 
(instance.*m_CommandSet[key])(param); 
+0

ありがとう、しかし、m_CommandSet ["HELP"] =&RemoteHostManager :: usage;の行にエラーが表示されています。 とuse memeber関数はvoidとして定義されていますRemoteHostManager :: usage(char * inCmd) – Avinash

+0

@Avinash:コンパイラエラーを投稿してください...コンパイラが表示するエラー.. – Nawaz

+0

これが問題です。 – Avinash

1

をマップでそれを設定するとき、あなたはインスタンスにメソッドをバインドする必要があります。 boost :: bindを使用すると、そうすることができます。

+0

何ですか?彼が使っている構文ではありません。また、それは彼がやりたいことからプログラムを変えるだろう。メンバー関数へのポインタ変数を読んでください。 – Potatoswatter

+0

どのインスタンスでメソッドが呼び出されますか?メソッドが静的でない場合 –