2011-07-06 54 views
0

編譯使用線程的程序時出現錯誤。這是導致問題的部分。如果有人告訴我是否以正確的方式調用線程函數,那將會很好。如何從main()調用線程成員函數

在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

通過「main.cpp():」你的意思是? 「main.cpp中的int main()」? – Johnsyweb

+0

是的。沒錯 –

回答

5

的語法取一個成員函數的地址是&ClassName::FunctionName,所以它應該是&WishList::show_list,但現在你需要一個對象來調用函數指針。最佳(和最簡單的)是使用boost::bind

#include <boost/bind.hpp> 

WishList w; 
boost::thread t(boost::bind(&WishList::show_list, &w)); 
2

無關,與線程,這僅僅是「我如何獲得一個指向一個成員函數」。做什麼編譯器說,說&WishList::show_list。但是您可能還需要傳遞實例指針。

更新:是的,使用bind就像Xeo說的那樣。

關於您的標題:請注意,該功能不屬於「屬於線程」。類不是線程的一部分。所有線程都訪問相同的內存 - 每個線程都有自己的空間用於自動存儲,但類定義中沒有任何內容表示「這是在單獨的線程中」。