我是这样做的,但它不起作用
#include <iostream>
using namespace std;
typedef int(*func)(int,int);
void test(func fun, int k, int b)
{
int result = fun(k, b);
cout << "result: " << result;
}
int main()
{
test([](int k, int b){ return k*2 + b},2,3);
}
我该怎么办才能让它发挥作用?
此问题已解决:
此问题无法将'anonymous-namespace'::转换为'func',请按照Joachim的建议,使用std::function
可以修复它。
这是固定代码:
#include <iostream>
#include <functional>
using namespace std;
int test(std::function<int (int,int)> fun, int k, int b)
{
return fun(k, b);
}
int main()
{
int result = test(
[](int k, int b)
{
return k*2 + b;
},2,3);
cout << "result: " << result;
return 0;
}
答案 0 :(得分:3)
您遇到语法错误:
test([](int k, int b){ return k*2 + b },2,3);
//^ here you missed semicolon!
上面的代码错过了注释中指示的分号。
这里纠正了:
test([](int k, int b){ return k*2 + b; },2,3);
// ^ corrected!
希望有所帮助。
答案 1 :(得分:2)
using func_t = std::function<int(int, int)>;
void test(func_t fun, int k, int b)
{
...
}
或只是模板:
template<typename F>
void test(F fun, int k, int b)
{
...
}
答案 2 :(得分:2)
首先,您应该在编译器中启用C++11标准。使用GCC 4.8,使用g++ -std=c++11 -Wall -g
进行编译。
然后你应该声明
void test(std::function<int(int,int)>fun, int k, int b)
lambda构造返回的closure(即std::function
)不是指向函数的指针(因为它混合了代码和封闭数据)。
最后,不要忘记lambda返回时的分号,其他人回答
test([](int k, int b){ return k*2 + b;},2,3);
答案 3 :(得分:2)
在lambda中为return语句留下一个分号。
int main()
{
test([](int k, int b){ return k*2 + b;},2,3);
}
答案 4 :(得分:0)
您不应该在测试函数中使用函数指针,而是使用std :: function类型:
typedef std::function<void (int, int)> func;
void test(func fun, int k, int b) {/*Same as before*/}