-2

我试过这个,但它不起作用

#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;
}
4

5 回答 5

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!

希望有帮助。

于 2013-10-08T07:51:40.317 回答
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 构造返回的闭包(即 )不是指向函数指针(因为它混合了代码和关闭的数据)。std::function

最后,不要忘记其他人回答的lambda返回中的分号

 test([](int k, int b){ return k*2 + b;},2,3);
于 2013-10-08T07:51:35.240 回答
2

在 lambda 中为 return 语句省略了一个分号。

int main()
{
    test([](int k, int b){ return k*2 + b;},2,3);
}
于 2013-10-08T07:52:06.080 回答
2

怎么样std::function

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)
{
    ...
}
于 2013-10-08T07:50:41.747 回答
0

您不应在测试函数中使用函数指针,而应使用 std::function 类型:

typedef std::function<void (int, int)> func;

void test(func fun, int k, int b) {/*Same as before*/}
于 2013-10-08T07:53:14.547 回答