Как передать функцию, используя параметры по умолчанию, в std :: thread?

Итак, у меня gcc версии 4.8.1, g ++ версии 4.6.4 с использованием флагов: -std = c ++ 0x и -pthread.

Я упростил свою проблему до показанного кода и все еще получаю исходную ошибку.

То, что я имею ниже, компилируется, но когда я раскомментирую две строки для потока «два», я получаю сообщение об ошибке, показанное ниже кода

#include <iostream>
#include <thread>
using namespace std;

void print_int(int x=7);
void print_A(){
cout << "A\n";
}

int main(){
thread one (print_int,17);
//thread two (print_int);
thread three (print_A);

one.join();
//two.join();
three.join();

return 0;
}

void print_int(int x){
cout << x << '\n';
}

Я попытался разобрать сообщения об ошибках, но до сих пор не понимаю, что происходит …

    In file included from /usr/include/c++/4.6/thread:39:0,
from def_params.cpp:2:

/usr/include/c++/4.6/functional: In member function ‘void std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__call(std::tuple<_Args ...>&&, std::_Index_tuple<_Indexes ...>, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type) [with _Res = void, _Args = {}, int ..._Indexes = {}, _Result = void, _Functor = void (*)(int), _Bound_args = {}, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type = int]’:

/usr/include/c++/4.6/functional:1378:24:   instantiated from ‘std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type std::_Bind_result<_Result, _Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {}, _Result = void, _Functor = void (*)(int), _Bound_args = {}, std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type = void]’

/usr/include/c++/4.6/thread:117:13:   instantiated from ‘void std::thread::_Impl<_Callable>::_M_run() [with _Callable = std::_Bind_result<void, void (*())(int)>]’

def_params.cpp:26:9:   instantiated from here

/usr/include/c++/4.6/functional:1287:4: error: too few arguments to function

Есть предложения или решения? Заранее спасибо!

4

Решение

thread two (print_int);

Вы не можете сделать это, аргументы по умолчанию в C ++ используются только на сайте вызова (например, когда вы звоните print_int() себя) в качестве синтаксического ярлыка, но не используются, например, когда std::thread вызывает ту же функцию, переданную ему в качестве аргумента. Проблема в std::thread получает указатель на функцию с одним аргументом, но ему не передается аргумент для его использования, поэтому он не знает, как его вызвать, и нет способа найти аргумент функции по умолчанию, если указан указатель на функцию ,

Самое простое решение — использовать лямбду для вызова функции, так как этот вызов может использовать аргумент по умолчанию:

thread two( []{ print_int(); } );
9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]