我有一个std映射,该映射将字符串与函数指针结合在一起,例如:
std::map<std::string, void (*)()> funcs {
{"print", &h::print},
{"scan", &h::scan_cmd},
{"connect", &h::stream},
{"stream", &h::stream}
};
其中h是已初始化此映射的封闭类:
class h {
public:
void print();
void scan();
void connect();
void stream();
std::map<std::string, void (*)()> funcs {
{"print", &h::print},
{"scan", &h::scan_cmd},
{"connect", &h::stream},
{"stream", &h::stream}
};
};
我收到此错误:
No matching constructor for initialization of 'std::map<std::string, void (*)()>' (aka 'map<basic_string<char>, void (*)()>')
我也尝试过以这种形式推入地图:
std::map<std::string, void (*)()> funcs;
funcs["print"] = &print;
funcs["scan"] = &scan_cmd;
funcs["connect"] = &stream;
funcs["stream"] = &stream;
但是后来我得到了这个错误:
Size of array has non-integer type ' const char [6]'
我不确定问题出在哪里-我的猜测是它的空白(*)()。我确定这是c ++ 11编译器。
答案 0 :(得分:1)
void (*)()
是指向不带任何参数且不返回任何值的普通函数的指针。
在您的示例中,print
,stream
,scan_cmd
是h
类的非静态成员函数。定义指向h
类成员函数的指针的语法类似于
void (h::*)()
尝试:
std::map<std::string, void (h::*)()> funcs {
{"print", &h::print},
{"connect", &h::stream},
{"stream", &h::stream}
};