2013-08-10 2 views
2

Я пытаюсь сохранить объект std::thread внутри класса. учитываяХранение объекта std :: thread как члена класса

class GenericWindow 
{ 
    public: 
     void Create() 
     { 
      // ... 
      MessageLoopThread = std::thread(&GenericWindow::MessageLoop, *this); 
     } 
    private: 
     std::thread MessageLoopThread; 
     void GenericWindow::Destroy() // Called from the destructor 
     { 
      SendMessageW(m_hWnd, WM_DESTROY, NULL, NULL); 
      UnregisterClassW(m_ClassName.c_str(), m_WindowClass.hInstance); 
      MessageLoopThread.join(); 
     } 
     void GenericWindow::MessageLoop() 
     { 
      MSG Msg; 
      while (GetMessageW(&Msg, NULL, 0, 0)) 
      { 
       if (!IsDialogMessageW(m_hWnd, &Msg)) 
       { 
        TranslateMessage(&Msg); 
        DispatchMessageW(&Msg); 
       } 
      } 
     } 
};  // LINE 66 

Ошибки:

[Line 66] Error C2248: 'std::thread::thread' : cannot access private member declared in class 'std::thread'

сообщение Этой ошибки не помогает мне, я не пытаюсь получить доступ к любому частному члену std::thread класса.

Что не так в моем коде? Как это исправить?

+1

Может быть, что вы пытаетесь скопировать экземпляр 'GenericWindow'? 'std :: thread' может быть скопирован только с копированием. – juanchopanza

+0

Не связано с вашим вопросом, но Win32-окна и многопоточность обычно не очень хорошо ладят. Графические интерфейсы однопоточные, если у вас нет оснований для реализации многопоточного графического интерфейса и не знаю, что вы делаете. – IInspectable

ответ

7

На этой линии:

MessageLoopThread = std::thread(&GenericWindow::MessageLoop, *this); 

Вы передаете *this по значению к std::thread конструктора, который будет пытаться сделать копию, чтобы перейти к вновь порожденного потока. *this, конечно, не подлежит копированию, так как он имеет член std::thread. Если вы хотите передать ссылку, вы должны поместить его в std::reference_wrapper:

MessageLoopThread = std::thread(&GenericWindow::MessageLoop, 
           std::ref(*this)); 
+2

[Я решил, что каждый день я дам этот ответ на один вопрос] (http://stackoverflow.com/a/18152978/923854). – Casey

+0

Когда я меняю его так, он дает странную ошибку компоновщика: 'C: \ ... \ MySolutionDir \ MyProjectDir \ MSVCRTD.lib (crtexew.obj) ошибка LNK2019: неразрешенный внешний символ WinMain, на который ссылается функция __tmainCRTStartup'. Я изменил его обратно, и вернулась обратно к той, которую я опубликовал в OP. Я снова положил 'std :: ref', и эта ошибка снова появилась. Я перестроил проект, он не внес каких-либо изменений. – hkBattousai

+0

@hkBattousai Я считаю, что ошибка компоновщика является результатом отсутствия в вашей программе 'main()' или 'WinMain()' - в любом случае это не связано с вопросом. – Casey

Смежные вопросы