我当前正在开发程序,并且想将函数指针传递给自定义比较器的映射。但是,在下面的至少一个可验证的示例中,这会产生错误:
#include <iostream>
#include <map>
struct CustomKey{
unsigned a;
};
bool compareCustom(const CustomKey &a, const CustomKey &b){
return a.a < b.a;
}
typedef decltype(compareCustom) CustomComparator;
int main(){
std::map<CustomKey, unsigned, CustomComparator> customMap(&compareCustom);
return 0;
}
使用GCC或Clang编译上述代码会产生大量无用的模板错误,完全以std::map
的内部实现为中心。 This question似乎建议传递函数指针类型是完全有效的。我的代码有什么问题?
答案 0 :(得分:3)
传递函数指针有效,但传递函数无效。
typedef decltype(compareCustom) CustomComparator;
实际上使CustomComparator
的类型为bool(const CustomKey&, const CustomKey&)
,这就是函数本身,而不是指针。
您应该使用:
typedef decltype(compareCustom) *CustomComparator;