2012-03-21 9 views
0

boost :: threadを使って次のプログラムを実行しようとしています。boost :: threadコンパイルエラー

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

using namespace std; 

class test{ 
public: 
    void hello(int i) 
    { 
    cout << i << " "; 
    }; 
}; 

int main(int argc, char* argv[]) 
{ 
    class test t; 
    boost::thread thrd(t.hello, 10); 
    thrd.join(); 
    return 0; 
} 

下記のようにコンパイルしながら、エラーを投げている:

thread.c:17:33: error: no matching function for call to 'boost::thread::thread(, int)' /usr/include/boost/thread/detail/thread.hpp:236:9: note: candidates are: boost::thread::thread(F, A1) [with F = void (test::*)(int), A1 = int] /usr/include/boost/thread/detail/thread.hpp:202:9: note:
boost::thread::thread(boost::detail::thread_move_t)

私はブースト1.42を使用しています。私も古いスタイルのboost :: threadの作成を試みました。

hello()がクラス関数ではない場合、すべて正常になります。どうすれば修正できるのか教えてください。

答えて

1

問題は、あなたが次のことを試してくださいメンバ関数にバインドしようとしているあります

boost::thread thrd(&test::hello, &t, 10); 

あなたは、バインダーを使用することができることを失敗(これは確かに動作するかどうか私はあなたのブーストバージョンはそうは考えている必要はありません)

boost::thread thrd(
    boost::bind(&test::hello, &t, 10)); 

コンパイラが十分に新しい場合は、std ::のboost namespaceを変更することで、それらのすべてに対応する標準ライブラリを使用できます(プレースホルダはグローバル名前空間ではなくstd :: placeholdersにあります)。

std::thread(... //c++11 
+0

最初の提案作業...答えに感謝します。 –

+0

@AkashAgrawalええ、それは私の方法で動作し、ちょうど1.42は昔のような、サービス兄弟になることがうれしいです。 – 111111

2

あなたはdocumentationを読んでいません。

次のいずれかの静的helloメソッドを機能させる、またはそれのコンストラクタに型テストのオブジェクトを渡すことで、スレッドを作成する必要があります。

int main(int argc, char* argv[]) 
{ 
    test t; 
    boost::thread thrd(&test::hello, &t, 10); 
    thrd2.join(); 
} 
+0

ええ、私は質問を投稿する前に、静的な関数functionでそれをテストし、彼らは明らかに動作します。非静的な関数では実行できませんでした。あなたの答えをありがとう、これを試してみてください。 –

0

このコードを試してみてください。

int main(int argc, char* argv[]) 
{ 
    test t; 
    boost::thread thrd(&test::hello,&t,10); 
    thrd.join(); 
    return 0; 
} 
関連する問題