std::map 和函数指针作为值
std::map and function pointer as the value
我正在尝试使用std::map
和 value
作为function pointer
,但我遇到了奇怪的编译错误。我做错了什么。 以下是我的代码。
#include <map>
#include <string>
typedef void (*fptrCmdHandler)(std::string&);
typedef std::map<std::string, fptrCmdHandler> Cmd2FnMap;
typedef std::map<std::string, Cmd2FnMap> Mode2CmdFnMap;
Mode2CmdFnMap gMode2CmdFnMap;
class SystemCommands {
public:
static void Help(std::string& result) {
result.append("connect").append("n");
result.append("addserver").append("n");
result.append("help").append("n");
}
};
int main( int argc, char **argv) {
//Initialize Global Commands
gMode2CmdFnMap.insert(std::make_pair("System", std::make_pair("help", &SystemCommands::Help)));
}
错误是
1>------ Build started: Project: test, Configuration: Debug Win32 ------
1> test.cpp
1>c:program files (x86)microsoft visual studio 10.0vcincludeutility(163): error C2664: 'std::map<_Kty,_Ty>::map(const std::map<_Kty,_Ty> &)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'const std::map<_Kty,_Ty> &'
1> with
1> [
1> _Kty=std::string,
1> _Ty=fptrCmdHandler
1> ]
1> and
1> [
1> _Ty1=const char *,
1> _Ty2=void (__cdecl *)(std::string &)
1> ]
1> and
1> [
1> _Kty=std::string,
1> _Ty=fptrCmdHandler
1> ]
1> Reason: cannot convert from 'std::pair<_Ty1,_Ty2>' to 'const std::map<_Kty,_Ty>'
1> with
1> [
1> _Ty1=const char *,
1> _Ty2=void (__cdecl *)(std::string &)
1> ]
1> and
1> [
1> _Kty=std::string,
1> _Ty=fptrCmdHandler
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:program files (x86)microsoft visual studio 10.0vcincludeutility(255) : see reference to function template instantiation 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base<_Ty,std::pair<const char *,void (__cdecl *)(std::string &)>>(_Other1 &&,_Other2 &&)' being compiled
1> with
1> [
1> _Ty1=const std::string,
1> _Ty2=Cmd2FnMap,
1> _Ty=const char *,
1> _Other1=const char *,
1> _Other2=std::pair<const char *,void (__cdecl *)(std::string &)>
1> ]
1> c:program files (x86)microsoft visual studio 10.0vcincludexmemory(208) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<const char*,std::pair<const char *,void (__cdecl *)(std::string &)>>(std::pair<const char *,std::pair<const char *,void (__cdecl *)(std::string &)>> &&)' being compiled
1> with
1> [
1> _Ty1=const std::string,
1> _Ty2=Cmd2FnMap
1> ]
1> c:program files (x86)microsoft visual studio 10.0vcincludexmemory(280) : see reference to function template instantiation 'void std::allocator<_Ty>::construct<std::pair<_Ty1,_Ty2>>(std::pair<const _Kty,std::map<_Kty,fptrCmdHandler>> ,_Other &&)' being compiled
1> with
1> [
1> _Ty=std::pair<const std::string,Cmd2FnMap>,
1> _Ty1=const char *,
1> _Ty2=std::pair<const char *,void (__cdecl *)(std::string &)>,
1> _Kty=std::string,
1> _Other=std::pair<const char *,std::pair<const char *,void (__cdecl *)(std::string &)>>
1> ]
1> c:program files (x86)microsoft visual studio 10.0vcincludextree(592) : see reference to function template instantiation 'void std::_Cons_val<std::allocator<_Ty>,_Ty,std::pair<_Ty1,_Ty2>>(_Alloc &,std::pair<const _Kty,std::map<_Kty,fptrCmdHandler>> *,std::pair<_Ty1,_Ty2> &&)' being compiled
1> with
1> [
1> _Ty=std::pair<const std::string,Cmd2FnMap>,
1> _Ty1=const char *,
1> _Ty2=std::pair<const char *,void (__cdecl *)(std::string &)>,
1> _Alloc=std::allocator<std::pair<const std::string,Cmd2FnMap>>,
1> _Kty=std::string
1> ]
1> c:program files (x86)microsoft visual studio 10.0vcincludextree(755) : see reference to function template instantiation 'std::_Tree_nod<_Traits>::_Node *std::_Tree_val<_Traits>::_Buynode<_Ty>(_Valty &&)' being compiled
1> with
1> [
1> _Traits=std::_Tmap_traits<std::string,Cmd2FnMap,std::less<std::string>,std::allocator<std::pair<const std::string,Cmd2FnMap>>,false>,
1> _Ty=std::pair<const char *,std::pair<const char *,void (__cdecl *)(std::string &)>>,
1> _Valty=std::pair<const char *,std::pair<const char *,void (__cdecl *)(std::string &)>>
1> ]
1> e:avinashtesttesttest.cpp(19) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert<std::pair<const char *,std::pair<const char *,void (__cdecl *)(std::string &)>>>(_Valty &&)' being compiled
1> with
1> [
1> _Ty1=std::_Tree_iterator<std::_Tree_val<std::_Tmap_traits<std::string,Cmd2FnMap,std::less<std::string>,std::allocator<std::pair<const std::string,Cmd2FnMap>>,false>>>,
1> _Ty2=bool,
1> _Traits=std::_Tmap_traits<std::string,Cmd2FnMap,std::less<std::string>,std::allocator<std::pair<const std::string,Cmd2FnMap>>,false>,
1> _Valty=std::pair<const char *,std::pair<const char *,void (__cdecl *)(std::string &)>>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
您正在尝试在需要地图的位置插入一对。对插入很好,但它应该是一个pair<string, map<string, F>>
.
为什么不直接说:
gMode2CmdFnMap["System"]["help"] = &SystemCommands::Help;
你不需要在这里太担心效率 - 在程序运行期间,这段代码会执行多少次?
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址