我正在尝试使用<function name, function ptr>
std::map
对
typedef int(*FnPtr)()
int Foo()
{
return 1;
}
map<const char*, FnPtr> funcMap;
funcMap.insert("Foo", Foo); // Error
我收到以下错误消息:
Error: no instance of overloaded function "std:map<_Kty, _Ty, _Pr, _Alloc>::insert[with _Kty=const char*, _Ty=FnPtr,_Pr=std::less < const char * > , _Alloc=std::allocator< std::pair< const char* const, FnPtr>>]" matches the argument list
argument types are: (const char[3], void())
对象类型是:
std::map< const char*, FnPtr, std::less < const char *>, std::allocator< std::pair < const char* const, FnPtr>>>
std:map
不支持自定义类型吗?
答案 0 :(得分:3)
map::insert
以std::pair
为参数,因此您需要
funcMap.insert(std::make_pair("Foo", Foo));
这将修复编译错误,但是,假设您关心元素的排序,那么map
的行为可能不如您预期的那样。根据定义,您的密钥将具有任意顺序,具体取决于编译器将字符串文字放置在内存中的地址,因为映射比较器将比较字符串文字的地址,而不是它们的内容。
如果您希望按字符串内容排序键,那么最简单的方法是将map
更改为
std::map<std::string, FnPtr> funcMap;
如果您想避免使用std::string
,并且只使用字符串文字,那么您可以定义一个自定义比较器来比较字符串
#include <cstring>
struct str_literal_less
{
bool operator()(char const *l, char const *r) const
{ return std::strcmp(l, r) < 0; }
};
然后将地图定义为
std::map<char const *, FnPtr, str_literal_less> funcMap;
答案 1 :(得分:1)
您必须在地图中插入一对。尝试:
funcMap.insert(make_pair("Foo", Foo));
如果你有C ++ 11支持,你可以
funcMap.insert({"Foo", Foo});
或者,你为什么不能这样做呢?
funcMap["Foo"] = Foo;
答案 2 :(得分:1)
你必须改变
funcMap.insert("Foo", Foo);
在
funcMap.insert(make_pair("Foo", Foo));
有关详细信息,请参阅此处http://www.cplusplus.com/reference/map/map/insert/