2016-08-08 5 views
3

Я изучаю некоторые новые возможности C++ и не могу получить следующий компилируемый код.max_element с лямбдой: как скомпилировать?

#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' и укажите опцию '-std = C++ 1z', чтобы использовать самую последнюю версию C++. Если вы хотите изучить 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 возвращает итератор, поэтому для того, чтобы распечатать значение, вам нужно уважать его.

Устаревшие Compiler Version

Вы пытаетесь использовать современный C++ функции со слишком старым компилятором. Я предлагаю вам обновить его. В любом случае вы можете использовать текущую версию компилятора, которую вы только что добавили в команду компилятора флаг -std=c++0x. Но, видя, что ваш вопрос вероятен, флаг включен по умолчанию.

+0

Диагностика, которую предлагает ОП, предлагает полную противоположность тому, что вы утверждаете в своем последнем предложении. –

+0

Отлично, оба подсказки работают (хотя неясно, почему «-std = C++ 0x» должен быть указан явно, когда компилятор говорит по умолчанию включен)! Спасибо. – user180574

+0

@ user180574: «включен по умолчанию» относится к языковой функции или расширению поставщика, а не к фразу '-std'. –

Смежные вопросы