2017-02-13 64 views
1

我正在繼續研究C++,並且遇到了lambda表達式。 我下面一個簡單的教程只是爲了感受一下的sintax,但下面的代碼失敗:C++:將帶參數的lambdas傳遞給函數

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

這是給我一個「標識符「一個未定義」和「標識‘B’被未定義」。雖然我從教程中複製了verbatin,也許我錯過了一些東西?

在此先感謝您的幫助!

邁克爾

+1

你忘了傳遞函數參數。 – juanchopanza

+1

'runDivide()'中沒有變量'a'和'b'。 – Barmar

+0

而不是複製嘗試瞭解代碼的作用。如果你明白了,那麼你就會明白'a'和'b'沒有在任何地方定義過。它們僅僅是函數指針的類型。 – tambre

回答

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; 
} 
+0

謝謝!現在看來很明顯(事後和所有)。我猜是因爲我對C++的這方面有所瞭解,所以我對函數指針的類型和參數名稱本身之間的區別感到困惑! –

0

runDivide的唯一參數是divideab未使用,可以省略。它們只是傳遞函數參數的佔位符。

1

你被允許名稱參數的函數指針,就像這裏:

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

名稱ab是兩個double人名該函數的函數指針divide點。

但是,這樣的名稱有對C++中代碼的行爲沒有影響。

double (*divide)(double, double) 

這個意思完全一樣。

divide是一個函數指針,指向一個函數,該函數需要兩個double s並返回一個double

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

這使得它更爲明顯,ab有在這一點上沒有任何意義。

您需要通過double adouble brunDivide,或在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 adouble b,並將它們設置爲合理的。我會認爲這是一個糟糕的主意,因爲全局變量是一團糟。

0

如果我沒有記錯的話,你通常無法從一個函數調用另一個函數的參數。由於它們只能在特定函數中訪問,所以必須全局聲明這些參數/變量。接下來,你忘了在代碼的更多部分中聲明它們。