我正在继续学习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,但也许我错过了什么?
提前感谢您的帮助!
迈克尔
答案 0 :(得分:1)
runDivide()
使用变量a
和b
,但从不声明它们或给它们赋值。它们应该是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)
名称a
和b
是函数指针double
指向的函数的两个divide
的名称。
但是,这些名称对C ++中的代码行为没有影响。
double (*divide)(double, double)
这具有完全相同的含义。
divide
是一个函数指针,指向一个函数,该函数需要两个double
并返回一个double
。
void runDivide(double (*divide)(double, double)) {
auto rval = divide(a , b);
cout << rval << endl;
}
这使a
和b
在这一点上没有任何意义显而易见。
您需要将double a
和double 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 b
和runDivide
,并将它们设置为合理的值。我认为这是一个坏主意,因为全局变量是一团糟。
答案 2 :(得分:0)
runDivide
的唯一参数是divide
。 a
和b
未使用,可以省略。它们只是传入函数参数的占位符。
答案 3 :(得分:0)
如果我没记错的话,你通常不能从一个函数调用另一个函数的参数。由于它们只能在特定函数中访问,因此必须全局声明这些参数/变量。接下来你忘了在代码的更多部分中声明它们。