C++ 线程:lambda捕获中的语法混乱

C++ 线程:lambda捕获中的语法混乱,c++,boost,c++11,lambda,C++,Boost,C++11,Lambda,我已经在一些头文件中包含了boost::thread.hpp,我在我制作的class结构之一中包含了这段代码: #include <boost/thread.hpp> #include <functional> typedef std::function<void ()> XEvent; enum X_Widget_Type { XW_BUTTON, XW_TEXTBOX, XW_CHECK_BOX, XW_COMBO_BO

我已经在一些头文件中包含了
boost::thread.hpp
,我在我制作的
class
结构之一中包含了这段代码:

#include <boost/thread.hpp>
#include <functional>

typedef std::function<void ()> XEvent;

enum X_Widget_Type
{
    XW_BUTTON,
    XW_TEXTBOX,
    XW_CHECK_BOX,
    XW_COMBO_BOX
};
//XWidget.h
class XWidget
{
public:
    XWidget(const char *name, const Rect& rect, X_Widget_Type type, const HWND parent) :

     onClick(nullptr)
    ,id(++X_ID_COUNTER)
    {
        int flags = WS_CHILD | WS_VISIBLE | WS_TABSTOP;
        char widget_name[128];

        switch (type)
        {
        case XW_BUTTON:
            flags |= BS_DEFPUSHBUTTON;
            strcpy(widget_name, "BUTTON");
            break;
        case XW_TEXTBOX:
            flags |= ES_USER_PRESENT;
            strcpy(widget_name, "EDIT");
            break;
        case XW_CHECK_BOX:
            flags |= BS_AUTOCHECKBOX;
            strcpy(widget_name, "BUTTON");
            break;
        case XW_COMBO_BOX:
            flags |= CBS_DROPDOWN;
            strcpy(widget_name, "COMBOBOX");
        }

        handle = CreateWindowEx(
            WS_EX_STATICEDGE,
            widget_name, name,
            flags,
            rect.x, rect.y,
            rect.width, rect.height,
            parent, (HMENU)getID(),
            GetModuleHandle(NULL),
            NULL);
    }

    XEvent onClick;

private:
    int XWidget::X_ID_COUNTER;
}

//XCheckbox.h
class XCheckbox :
    public XWidget
{
    XCheckbox(const char *name, const Rect& rect, const HWND parent) :
        XWidget(name, rect, XW_CHECK_BOX, parent) { }
    ...
}

//main.cpp

bool cheat1 = false;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

    CWin app("win32app", nCmdShow);
    ...

    XCheckbox chkbox("checkbox", {0, 0, 50, 22}, app.getHandle());

    XCheckbox.onClick =
    [chkbox, app, &cheat1] //  <--this doesn't compile when I include `boost::thread.hpp` ?
    {
        ...
    };

    ...
}
但是,如果我排除了
boost::thread.hpp
,它编译得很好吗

我错过了什么?有什么问题吗

更新:

之所以要包括
boost::thread.hpp
,就是因为这个函数

void createThread(std::function<void ()> thread_function)
{
    threads.push_back(boost::thread(thread_function));
}
void createThread(std::function thread\u function)
{
threads.push_back(boost::thread(thread_函数));
}

模板
void createThread(T thread_函数)
{
threads.push_back(boost::thread(thread_函数));
}

忽略您遇到的奇怪的
boost::thread
错误,问题在于尝试将对静态变量的引用传递给lambda函数,这是不可能的(有关原因的更多信息,请参阅此问题:)


t的长短是不需要将
cheat1
传递给lambda函数,因为
cheat1
已经可以访问。删除lambda的
&cheat1
参数并正常访问变量。

您试图以某种方式复制
boost::thread
。考虑到这段代码没有提到一个,很难说是怎么回事。@chris是lambda函数,编译器自动将它翻译成typeof
boost::thread
?lambda与
boost::thread
无关。该语言不知道Boost是否存在,更不用说它的线程类了。请生成一个。@chris请查看我的更新,请告诉我这是否符合我只需要去掉编译错误中的一点,正确的语法是什么?不管怎样,谢谢您的提醒。如果您有
[chkbox,app,&cheat1]
,请将其替换为
[chkbox,app]
。或者,您可以将其替换为通过引用捕获所有范围内变量的
[&]
。。我现在应该怎么做才能得到这个编译呢?如果仍然得到boost错误,只需删除
#include
行即可。从我所看到的,基于所提供的源代码,没有理由这样做。我想使用
boost/thread.hpp
,这就是为什么我要包含它。请看我的更新。谢谢
void createThread(std::function<void ()> thread_function)
{
    threads.push_back(boost::thread(thread_function));
}
template<typename T>
void createThread(T thread_function)
{
    threads.push_back(boost::thread(thread_function));
}