std :: thread Visual Studio 2012 Предупреждение

Я пытаюсь понять, как использовать новый поток std :: thread с помощью Visual Studio 2012. Я пытаюсь скомпилировать следующий код.

#include <iostream>
#include <thread>

class scoped_thread
{
std::thread t_;

public:

explicit scoped_thread(std::thread & t): t_(std::move(t))
{
if(!t_.joinable())throw std::logic_error("No thread");
}

~scoped_thread()
{
t_.join();
}

private:

scoped_thread(scoped_thread const &);
scoped_thread & operator=(scoped_thread const &);
};

struct local_functor
{
int& i_;

local_functor(int & i):i_(i){}

void operator()()
{
while(i_ < 1e5)i_++;
}
};

// can potentially throw exceptions
void callAnotherFunc()
{
std::cout << "this function can throw an exception" << std::endl;
// try (un)commenting the line below and see the behaviour
throw std::out_of_range("WTF2");
}int main()
{
int some_local_state =  0;

try
{
scoped_thread t(std::thread(local_functor(some_local_state)));
callAnotherFunc();

std::cout << "Proper exit of function" << std::endl;
}
catch(const std::exception & e)
{
std::cout << e.what() << " exception occurred!" << std::endl;
}
catch(...)
{
std::cout << "Unhandled exception!" << std::endl;
}

return 0;
}

Я получаю предупреждение, которое говорит
предупреждение C4930: ‘scoped_thread t (std :: thread (__cdecl *) (local_functor))’: не вызвана прототипная функция (было ли предназначено определение переменной?)

Да, это было определение переменной, которая была предназначена. Как я должен это сделать?

4

Решение

Предупреждение говорит вам, что первая строка в вашем блоке try анализируется как объявление функции. Это иногда радует, если вы используете стиль инициализации C ++ 03. Вместо этого используйте равномерную инициализацию:

scoped_thread t{std::thread{local_functor{some_local_state}}};

Кроме того, у вас отсутствует & в конструкторе scoped_thread:

explicit scoped_thread(std::thread && t): t_(std::move(t))
//                                 ^-- use r-value ref

PS:
Если ваш компилятор не поддерживает одинаковую инициализацию, заключите инициализатор в другую пару скобок: scoped_thread t((std::thread(local_functor(some_local_state))));

6

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

Вы наткнулись на самый неприятный разбор.

Вы можете решить это с помощью равномерная инициализация синтаксис:

scoped_thread t{std::thread(local_functor(some_local_state))};
6

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