作为编程练习,我决定尝试为我正在用c ++编写的课程实现我所有的haskell作业。目前,我正在尝试发送此功能:
int callme(){
cout << "callme called" << endl;
return 0;
}
到这个功能:
template<class type1,class type2> void callfunc(type1(*f)(type2)){
(*f)();
}
通过此电话:
int main(){
callfunc<int,void>(callme);
}
但我得到错误:
macros.cc: In function ‘int main()’:
macros.cc:45:29: error: no matching function for call to ‘callfunc(int (&)())’
是什么给出的?我能够以完全相同的方式发送函数作为参数,只是没有模板......唯一应该改变的是在编译之前将类型名称替换为适当的位置,不是吗?
答案 0 :(得分:1)
我认为'void'是c ++中的'特殊情况'。编译器无法匹配f()到f(void) 用任何其他类型替换它,它将编译。 对我而言,它只是另一种c ++魔术,但也许有人知道的更好。这将编译:
int callme(int){ printf("ok int\n"); return 0; }
int callme(char){ printf("ok char\n"); return 0; }
template<class type1,class type2> void callfunc(type1(*f)(type2), type2 p) {
(*f)(p);
}
int main() {
callfunc<int,int>(callme, 1);
callfunc<int,char>(callme, 1);
}