我在编译使用线程的程序时遇到错误。这是导致问题的部分。如果有人告诉我是否以正确的方式调用线程函数,那将会很好。
在main.cpp中:
int main()
{
WishList w;
boost::thread thrd(&w.show_list);
thrd.join();
}
在another_file.cpp中:
class WishList{
public:
void show_list();
}
void WishList::show_list(){
.
.
.
.
}
我收到以下错误
error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say ‘&WishList::show_list’
/home/sharatds/Downloads/boost_1_46_1/boost/thread/detail/thread.hpp: In member function ‘void boost::detail::thread_data<F>::run() [with F = void (WishList::*)()]’:
/home/sharatds/Downloads/boost_1_46_1/boost/thread/detail/thread.hpp:61:17: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((boost::detail::thread_data<void (WishList::*)()>*)this)->boost::detail::thread_data<void (WishList::*)()>::f (...)’, e.g. ‘(... ->* ((boost::detail::thread_data<void (WishList::*)()>*)this)->boost::detail::thread_data<void (WishList::*)()>::f) (...)’
编辑:在为线程安装Boost库时遇到问题。一旦工作就应该试试这个
答案 0 :(得分:5)
获取成员函数地址的语法是&ClassName::FunctionName
,因此它应该是&WishList::show_list
,但现在需要一个对象来调用函数指针。最好(也是最简单)就是使用boost::bind
:
#include <boost/bind.hpp>
WishList w;
boost::thread t(boost::bind(&WishList::show_list, &w));
答案 1 :(得分:2)
与线程无关,这只是“我如何获得指向成员函数的指针”。做编译器所说的,说&WishList::show_list
。但是您可能还需要传递实例指针。
更新:是的,请像Xeo所说的那样使用bind
。
关于您的标题:请注意,该功能不属于“线程”。类不是线程的一部分。所有线程都访问相同的内存 - 每个线程都有自己的自动存储空间,但是类定义中没有任何内容表示“这是在一个单独的线程中”。