operator()
- это просто имя со странным написанием.
Если вы переименуете его во что-то «не магическое», например «call_as_function», вы получите
class WorkerThread{
public:
void call_as_function()
{
std::cout<<"Worker Thread "<<std::this_thread::get_id()<<" is Executing"<<std::endl;
}
};
int main()
{
std::thread threadObj(WorkerThread().call_as_function());
threadObj.join();
std::cout<<"Exiting from Main Thread"<<std::endl;
return 0;
}
, где вы, вероятно, видите, что это неправильно - вы хотите передать экземпляр WorkerThread
, а не результат вызова функции-члена экземпляра WorkerThread
.
причина дополнительной пары скобок в рабочем Дело в том, что вам нужно
std::thread threadObj((WorkerThread()))
, а не
std::thread threadObj(WorkerThread())
, что без них вы получите объявление функции.
Возможно, вы видели что-то подобное,
request for member ‘join’ in ‘threadObj’, which is of non-class type ‘std::thread(WorkerThread (*)())’
, которое говорит, что threadObj
- это функция, которая принимает указатель на функцию без параметров, которая возвращает WorkerThread
, и возвращает std::thread
.
Введите "самый неприятный синтаксический анализ" в поисковик по вашему выбору для деталей.