我不确定如何说出这个问题。我有一个简单的demo。
我认为这段代码可行,但我收到下面的编译错误。将T更改为int(注释掉的行)使其工作,但现在它不再是通用的。为什么这个当前版本没有编译?以及如何使这项工作?
#include <cstdio>
#include <functional>
template<class T>
void test(T t, std::function<void(T)> f) { f(t); }
//void test(T t, std::function<void(int)> f) { f(t); }
void PrintIt(int v){ printf("V=%d\n", v); };
int main(int argc, char *argv[]) {
test(5, PrintIt);
}
结果:
prog.cpp: In function 'int main(int, char**)':
prog.cpp:11:20: error: no matching function for call to 'test(int, void (&)(int))'
test(5, PrintIt);
^
prog.cpp:11:20: note: candidate is:
prog.cpp:4:6: note: template<class T> void test(T, std::function<void(T)>)
void test(T t, std::function<void(T)> f) { f(t); }
^
prog.cpp:4:6: note: template argument deduction/substitution failed:
prog.cpp:11:20: note: mismatched types 'std::function<void(T)>' and 'void (*)(int)'
test(5, PrintIt);