c ++:将带参数的lambda传递给函数

时间:2017-02-13 19:24:49

标签: c++ lambda

我正在继续学习C ++,我遇到了lambdas。 我正在按照一个简单的教程来感受sintax,但下面的代码失败了:

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

void runDivide(double (*divide)(double a, double b)) {
    auto rval = divide(a , b);
    cout << rval << endl;
}

int main() {

  auto funcDiv = [](double value1, double value2) -> double{
      if (value2 == 0.0) {
          return 0;
      }
      return value1 / value2;
  };

  runDivide(funcDiv);

  system("pause");

  return 0;
}

这给了我一个“标识符'a'未定义”和“标识符'b'未定义”。虽然我正在从教程中复制它的verbatin,但也许我错过了什么?

提前感谢您的帮助!

迈克尔

4 个答案:

答案 0 :(得分:1)

runDivide()使用变量ab,但从不声明它们或给它们赋值。它们应该是runDivide的参数,而不是函数参数声明的一部分(您不需要为这些参数赋予名称,只需声明类型)。

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

void runDivide(double (*divide)(double, double), double a, double b) {
    auto rval = divide(a , b);
    cout << rval << endl;
}

int main() {

  auto funcDiv = [](double value1, double value2) -> double{
      if (value2 == 0.0) {
          return 0;
      }
      return value1 / value2;
  };

  runDivide(funcDiv, 30.0, 12.3);

  system("pause");

  return 0;
}

答案 1 :(得分:1)

您可以在函数指针中命名参数,如下所示:

double (*divide)(double a, double b)

名称ab是函数指针double指向的函数的两个divide的名称。

但是,这些名称对C ++中的代码行为没有影响

double (*divide)(double, double)

这具有完全相同的含义。

divide是一个函数指针,指向一个函数,该函数需要两个double并返回一个double

void runDivide(double (*divide)(double, double)) {
  auto rval = divide(a , b);
  cout << rval << endl;
}

这使ab在这一点上没有任何意义显而易见。

您需要将double adouble b传递给runDivide,或将其显示在runDivide的范围内。

这个“函数参数名称无效”对于函数指针和函数声明都是正确的(但不包含函数定义或lambda定义)。

修复此更改

runDivide(funcDiv);

runDivide(funcDiv,1.0, 2.0);

void runDivide(double (*divide)(double, double)) {
  auto rval = divide(a , b);
  cout << rval << endl;
}

void runDivide(double (*divide)(double, double), double a, double b) {
  auto rval = divide(a , b);
  cout << rval << endl;
}

或者,只需在double a之前添加全局变量double brunDivide,并将它们设置为合理的值。我认为这是一个坏主意,因为全局变量是一团糟。

答案 2 :(得分:0)

runDivide的唯一参数是divideab未使用,可以省略。它们只是传入函数参数的占位符。

答案 3 :(得分:0)

如果我没记错的话,你通常不能从一个函数调用另一个函数的参数。由于它们只能在特定函数中访问,因此必须全局声明这些参数/变量。接下来你忘了在代码的更多部分中声明它们。