[英]c++: Passing lambdas with parameters to functions
我繼續學習C ++,遇到了lambda。 我正在遵循一個簡單的教程,只是為了了解正弦波,但是以下代碼失敗了:
#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'未定義”。 盡管我從教程中復制了它的詳細內容,但也許我遺漏了一些東西?
先謝謝您的幫助!
邁克爾
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;
}
您可以在函數指針中命名參數,如下所示:
double (*divide)(double a, double b)
名稱a
和b
是函數指針divide
的函數所指向的兩個double
的名稱。
但是,此類名稱對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;
}
或者,只需在runDivide
之前添加全局變量double a
和double b
並將它們設置為合理的值即可。 我認為這是一個壞主意,因為全局變量是一團糟。
runDivide
的唯一參數是divide
。 a
和b
不使用,可以省略。 它們只是傳入函數的參數的占位符。
如果我沒記錯的話,通常無法從一個函數調用另一個函數的參數。 由於只能在特定的函數中訪問它們,因此必須全局聲明這些參數/變量。 接下來,您忘了在代碼的進一步部分中聲明它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.