В вашем коде все в порядке. Кажется, это просто ошибка в G CC, которая не имеет ничего общего с потоками. Минимальный тестовый пример, воспроизводящий ошибку:
template <typename... T>
void foo(T...) {}
int main()
{
auto* pfoo = foo<void(int)>;
return 0;
}
Кажется, G CC не нравится тот факт, что foo
имеет параметр типа void(int)
. Тем не менее, правила языка ясны: это разрешено, и тип функции настраивается на соответствующий тип указателя функции, когда он появляется как тип параметра.
У других компиляторов, похоже, нет проблем с этим. См. https://godbolt.org/z/tgaV7B
В качестве обходного пути вы можете написать:
thread t(threadProc<void(*)(int)>, 1, callback);
Или:
thread t(threadProc<decltype(&callback)>, 1, callback);