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函数,编译器自动将它翻译成typeofboost::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));
}