2016-08-08 9 views
3

私はいくつかの新しいC++機能を学習しており、次のコードをコンパイルできませんでした。max_elementとlambda:コンパイル方法は?

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

私のgccのバージョン:

$ 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. 

出力私がコンパイルしよう:

$ 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) 

がどのように私は、このコンパイルエラーを修正することができますか?

+2

先史バージョンのgccをgcc 6.1.1にアップグレードし、最新のバージョンのC++を使用するには '-std = C++ 1z'オプションを指定してください。 C++を学びたい場合は、最新のC++コンパイラを使用する必要があります。 –

+1

また、イテレータには一般に、フォーマットされた出力を生成するためのオーバーロードはありません。 –

答えて

2

ここには2つのヒントがあります。

構文エラー

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

*演算子。 max_elementはイテレータを返しますので、値を出力するにはそれを尊重する必要があります。

あなたはあまりにも古いコンパイラで近代的なC++ 機能を使用しようとしている廃止されたコンパイラバージョン

。私はそれをアップグレードすることをお勧めします。 とにかく、現在のコンパイラのバージョンを使用することができます。ちょうどフラグ-std=c++0xをコンパイラコマンドに追加しています。しかし、あなたの質問から見ると、フラグはデフォルトで有効になっています。

+0

OPが提示した診断は、あなたが最後の文章で主張していることとは正反対のことを示唆しています。 –

+0

両方のヒントがうまくいきます(コンパイラがデフォルトで有効になっている間に "-std = C++ 0x"を明示的に指定しなければならない理由は不明ですが)!ありがとうございました。 – user180574

+0

@ user180574: "デフォルトで有効"は、言語機能またはベンダー拡張を指し、 '-std'フラグを意味しません。 –

関連する問題