2016-08-08 48 views
3

Ich lerne einige neue C++ - Funktionen und konnte den folgenden Code nicht kompiliert bekommen.max_element mit Lambda: wie kompilieren?

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    std::vector<int> numbers; 
    numbers.push_back(1); 
    numbers.push_back(5); 
    numbers.push_back(3); 
    numbers.push_back(9); 
    numbers.push_back(10); 
    numbers.push_back(8); 

    std::cout << std::max_element(numbers.begin(), numbers.end(), [](int a, int b) { return a < b;}) << std::endl; 
    return 0; 
} 

Meine gcc Version:

$ gcc --version 
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

Die Ausgabe, wenn ich zu kompilieren versuchen:

$ g++ test_max_element.C 
test_max_element.C: In function ‘int main()’: 
test_max_element.C:15:99: warning: lambda expressions only available with -std=c++0x or -std=gnu++0x [enabled by default] 
test_max_element.C:15:100: error: no matching function for call to ‘max_element(std::vector<int>::iterator, std::vector<int>::iterator, main()::<lambda(int, int)>)’ 
test_max_element.C:15:100: note: candidates are: 
/usr/include/c++/4.6/bits/stl_algo.h:6229:5: note: template<class _FIter> _FIter std::max_element(_FIter, _FIter) 
/usr/include/c++/4.6/bits/stl_algo.h:6257:5: note: template<class _FIter, class _Compare> _FIter std::max_element(_FIter, _FIter, _Compare) 

Wie kann ich diese Zusammenstellung Fehler zu beheben?

+2

Aktualisieren Sie Ihre prähistorische Version von 'gcc' auf' gcc 6.1.1', und geben Sie die Option '-std = C++ 1z' ​​an, um die neueste Version von C++ zu verwenden. Wenn Sie C++ lernen wollen, müssen Sie einen modernen C++ - Compiler verwenden. –

+1

Außerdem wird der Iterator im Allgemeinen keine Überladung haben, die es ermöglicht, formatierte Ausgaben zu erzeugen. –

Antwort

2

Ich habe 2 Hinweise hier.

Syntaxfehler

std::cout << *std::max_element(numbers.begin(), numbers.end(), [](int a, int b) { return a < b;}) << std::endl; 

Hinweis der * Betreiber. Sie benötigen es, weil max_element einen Iterator zurückgibt. Um den Wert zu drucken, müssen Sie ihn daher abstufen.

Veraltet Compiler Version

Sie versuchen, ein modernes C++ verwenden Funktionen mit einem zu alten Compiler. Ich schlage vor, Sie zu aktualisieren. Wie auch immer, Sie können die aktuelle Version des Compilers verwenden, indem Sie einfach das Flag -std=c++0x dem Compilerbefehl hinzufügen. Aber wahrscheinlich ist die Flagge standardmäßig aktiviert.

+0

Die Diagnose, die das OP präsentierte, deutet das genaue Gegenteil von dem an, was Sie in Ihrem letzten Satz behaupten. –

+0

Großartig, beide Hinweise funktionieren (obwohl unklar, warum "-std = C++ 0x" explizit angegeben werden muss, während der Compiler standardmäßig aktiviert anzeigt)! Vielen Dank. – user180574

+0

@ user180574: "Standardmäßig aktiviert" bezieht sich auf die Sprachfunktion oder die Herstellererweiterung, nicht auf das Flag "-std". –