【发布时间】:2013-01-22 07:12:02
【问题描述】:
我对 C++ 非常陌生。我的经验主要是使用 javascript 和 java。
我在 Lion 上使用 Xcode。以下代码给了我一个编译错误“必须调用对非静态成员函数的引用;您的意思是不带参数调用它吗?”
class MyClass {
private:
void handler() {
}
public:
void handleThings() {
std::thread myThread(handler);
}
};
我还尝试了this->handler、&handler 和其他变体,但都没有奏效。这段代码可以编译并完成我想要的:
class MyClass {
private:
void handler() {
}
public:
void handleThings() {
std::thread myThread([this]() {
handler();
});
}
};
为什么我不能传递对成员函数的引用?我的变通办法是最好的解决方案吗?
【问题讨论】:
-
这不是“解决方法”...这是完成任务的正确方法(其中之一)。第二个是使用
std::bind而不是lambda。要调用类的方法,您必须提供该类的实例(this指针作为任何非静态成员函数的第一个隐式参数)。仅将您要调用的方法的地址(没有实例)传递给std::threadctor 显然是不够的。 -
根据您的任务考虑使用
std::async而不是std::thread...,以防运行线程只是计算并退出(即不是偶数循环处理程序) -
我现在明白了。你的第一条评论 zaufi 以及这个答案 stackoverflow.com/a/12765270/711902 教会了我一些东西。
标签: c++ lambda function-pointers