2015-12-10 2 views
2
#include <initializer_list> 
#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <functional> 

std::function<void(int)> sample_function() 
{ 
    return 
     [](int x) -> void 
    { 
     if (x > 5) 
      std::cout << x; 
    }; 
} 

int main() 
{ 
    std::vector<int> numbers{ 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 }; 
    std::for_each(numbers.begin(), numbers.end(), sample_function); 
} 

я пытаюсь передать sample_function() для for_each, но я сталкиваюсь с этой ошибкойпрохождения станд :: функции в качестве параметра for_each

Ошибка C2197 «станд :: функция»: слишком много аргументов для вызова

+0

Этот код не передает 'std :: function' в' for_each'. Он передает 'sample_function', которая является функцией, которая не принимает аргументов и возвращает объект типа' std :: function '. Сообщение об ошибке правильное: 'sample_function' не принимает никаких аргументов, поэтому не может быть вызван с элементами диапазона. –

ответ

3

Я думаю, что вы хотите следующего

#include <iostream> 
#include <vector> 
#include <functional> 

std::function<void(int)> sample_function = [](int x) 
{ 
    if (x > 5) std::cout << x << ' '; 
}; 


int main() 
{ 
    std::vector<int> numbers{ 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 }; 
    std::for_each(numbers.begin(), numbers.end(), sample_function); 
} 

Выход

10 15 20 25 35 45 50 

Или, если вы действительно хотите, чтобы определить функцию, которая возвращает объект типа std::function, то вы можете напишите

#include <iostream> 
#include <vector> 
#include <functional> 

std::function<void(int)> sample_function() 
{ 
    return [](int x) 
      { 
       if (x > 5) std::cout << x << ' '; 
      }; 
} 


int main() 
{ 
    std::vector<int> numbers{ 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 }; 
    std::for_each(numbers.begin(), numbers.end(), sample_function()); 
} 

0 utput будет таким же, как показано выше. Обратите внимание на звонок

std::for_each(numbers.begin(), numbers.end(), sample_function()); 
                   ^^^^ 
0

Вам нужно скобку, чтобы вызвать вызов функции sample_function в свою очередь, он будет возвращать std::function объект для for_each:

std::function<void(int)> sample_function() { 
    return [](int x) -> void { 
    if (x > 5) std::cout << x; 
    }; 
} 

int main() { 
    std::vector<int> numbers{ 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 }; 
    std::for_each(numbers.begin(), numbers.end(), sample_function()); 
                   ^^ 
} 

Live Demo

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