2

我试图将一个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

给出的错误:

[第 66 行] 错误 C2248:“std::thread::thread”:无法访问在类“std::thread”中声明的私有成员

此错误消息对我没有帮助,我没有尝试访问std::thread该类的任何私有成员。

我的代码有什么问题?我如何解决它?

4

1 回答 1

7

在这条线上:

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

您正在将*this值传递给std::thread构造函数,它将尝试制作一个副本以传递给新生成的线程。*this当然是不可复制的,因为它有一个std::thread成员。如果你想传递一个引用,你需要把它放在一个std::reference_wrapper

MessageLoopThread = std::thread(&GenericWindow::MessageLoop,
                                std::ref(*this));
于 2013-08-10T16:00:22.840 回答