c ++ 11 std :: thread компилируется с функцией, но не с классом

Я использую g ++ 4.7 с флагом c ++ 11. В этой демонстрации:

#include <iostream>
#include <thread>

class do_work
{
public:
void operator()()
{
std::cout << "Doing work..." << std::endl;
}
};

void foo()
{

}

int main()
{
// Does not work
std::thread t(do_work);
t.join(); // error: request for member ‘join’ in ‘t’, which is of non-class type ‘std::thread(do_work)’

// Works
std::thread t2(foo);
t2.join();

return 0;
}

Я могу успешно вызвать join () в потоке, который был создан с функцией в качестве аргумента конструктора, но я не могу вызвать join () (см. Встроенную ошибку) в потоке, который был создан с помощью функтора в качестве аргумента конструктора. Кто-нибудь может объяснить это?

2

Решение

Вы объявили t как функция, принимающая do_work и возвращаясь std::thread,

Вы, вероятно, хотите написать

do_work worker;
std::thread t{worker};

или же

std::thread t{do_work{}};

или же

std::thread t((do_work()));

Обратите внимание, что

std::thread t(do_work());

не сработает; его досадно разобрали как объявление функции t принимая функцию, которая не принимает аргументов и возвращает do_workи возвращаясь std::thread, Упаковка do_work временный с круглыми скобками или с использованием единого синтаксиса инициализатора (в любой момент) это исправит.

Это хорошая причина для того, чтобы по возможности использовать унифицированный синтаксис инициализатора; если бы ты написал

std::thread t{do_work};  // incorrect

тогда компиляция не удалась бы в этой строке вместо join,

11

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

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

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