2013-01-19 89 views
4

嘿所以我正在使用字符串作爲鍵和成員函數指針作爲值的映射。我似乎無法弄清楚如何添加到地圖,這似乎並沒有工作。C++字符串和成員函數指針的映射

#include <iostream> 
#include <map> 
using namespace std; 

typedef string(Test::*myFunc)(string); 
typedef map<string, myFunc> MyMap; 


class Test 
{ 
private: 
    MyMap myMap; 

public: 
    Test(void); 
    string TestFunc(string input); 
}; 





#include "Test.h" 

Test::Test(void) 
{ 
    myMap.insert("test", &TestFunc); 
    myMap["test"] = &TestFunc; 
} 

string Test::TestFunc(string input) 
{ 
} 
+2

猜測,但'&測試:: TestFunc '? – chris

+0

似乎修復參數中的一個錯誤,但我仍然得到一個錯誤插入 – ThingWings

+1

@Kosmo這是因爲'插入'不工作的方式。 –

回答

9

value_type

myMap.insert(std::map<std::string, myFunc>::value_type("test", &Test::TestFunc)); 

std::map::insertstd::mapoperator[]

myMap["test"] = &Test::TestFunc; 

您不能使用成員函數指針沒有對象。您可以使用成員函數指針與類型的對象Test

Test t; 
myFunc f = myMap["test"]; 
std::string s = (t.*f)("Hello, world!"); 

或用指針型Test

Test *p = new Test(); 
myFunc f = myMap["test"]; 
std::string s = (p->*f)("Hello, world!"); 

參見C++ FAQ - Pointers to member functions

+0

+1,雖然因爲'std :: map :: value_type'是'pair '我喜歡插入'MyMap :: value_type(a,b)'而不是'std :: make_pair(a,b)'否則你得到'對'必須被轉換爲'對',並且轉換不能被消除。 –

+0

@OlafDietsche +1美好的接吻! – dasblinkenlight

+0

我只是想知道是否將字符串文字傳遞給make_pair應該工作?畢竟,隱含的模板類型是char [5],而不是std :: string或somesuch。 –