2011-01-18 3 views
1

"KEYWORD"키 값과 "클래스 멤버 함수"값을 사용하여 stl 맵을 만들려고합니다. 그러나 컴파일되지 않습니다. 다음은 코드입니다. 아무도 나에게 무엇이 잘못되었는지 알려주실 수 있습니까? 클래스 멤버 함수는 정적이 아닙니다.클래스 멤버 변수가있는 C++ 함수 포인터 맵

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

주 모든 멤버 함수는 CmdHandlerPtr의 유형과 일치해야합니다

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; 

먼저 std::string 그것을 const char*을 만들거나 더 나은 : 다음

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; 
} 

오류입니다 . 즉, 매개 변수 유형은 char*이어야하며 반환 유형은 void이어야합니다. 클래스 멤버 함수는 정적이 아닌 경우

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

고마워,하지만 라인 m_CommandSet에서 오류가 발생했습니다 [ "도움말"] = & RemoteHostManager :: 사용; 이고 use memeber 함수가 void로 정의되었습니다. RemoteHostManager :: usage (char * inCmd) – Avinash

+0

@Avinash : 컴파일러 오류도 게시하십시오 ... 컴파일러가 표시하는 오류가 ... – Nawaz

+0

해당 질문에 표시했습니다. – Avinash

1

, 당신은지도에 설정시 인스턴스와 방법을 결합해야합니다

지도를 사용

, 당신은 유형 RemoteHostManager의 인스턴스가 필요합니다. boost :: bind를 사용하면 그렇게 할 수 있습니다.

+0

무엇? 그가 사용하는 구문이 아닙니다. 또한 그것은 그가 원하는 것을 프로그램을 바꿀 것입니다. 멤버 함수 함수에 대한 포인터 변수를 읽어보십시오. – Potatoswatter

+0

어떤 인스턴스에서 메소드를 호출 할 것인가? 그런 다음 메소드가 정적이 아닌가? –