2011-12-16 9 views
1
class c 
{ 
public: 
    int id; 
    boost::thread_group thd; 
    c(int id) : id(id) {} 
    void operator()() 
    { 
     thd.create_thread(c(1)); 
     cout << id << endl; 
    } 


}; 

私はクラスcを作成しました。各クラスオブジェクトは、作業を処理するためにスレッドを作成します。私はこのクラス内のthread_groupを使用したC++ブースト

をコンパイルするときしかし、私はこの奇妙なメッセージが表示されます:エラーC2248:「後押し:: thread_groupを:: thread_group」:プライベートメンバにアクセスすることはできませんが、クラス内で宣言「ブースト:: thread_group」

を加えて、ちょうどであると仮定します再帰呼び出しの問題はありません。

答えて

3

コードの設定方法は、オブジェクトのコピーを渡して新しいスレッドを作成することです。

boost :: thread_groupのコピーコンストラクタがprivateであるため、クラスcのオブジェクトをコピーできないため、エラーが発生しています。デフォルトのコピーコンストラクタがすべてのメンバーをコピーしようとし、boost :: thread_groupをコピーできないため、クラスcのオブジェクトをコピーすることはできません。したがって、コンパイラのエラーです。

古典的な解決方法は、boost :: thread_groupをコピーしようとしない独自のコピーコンストラクタを書くことです(実際には呼び出しごとに一意のthread_groupが必要な場合)。boost :: thread_groupを(グループを共有し、おそらくあなたが望むもの)何らかのコピーが可能です。

注:

それはあなた自身のオペレータを()書き、とだけではなく、ブースト::関数に沿って通過しないように、通常は簡単です。これは、どのようなクラスCであることを共有しており、どんな関数呼び出しの値によって渡されることは共有されていないことを

#include <boost/thread.hpp> 
#include <iostream> 
using namespace std; 
class c 
{ 
public: 
    boost::thread_group thd; 

    void myFunc(int id) 
    { 
     boost::function<void(void)> fun = boost::bind(&c::myFunc,this,1); 
     thd.create_thread(fun); 
     cout << id << endl; 
    } 


}; 

注意して行われることになります。

+0

しかし、メンバー変数と関数を持つクラスオブジェクトを作成する必要があります。だから私は単一の関数としてスレッドを作ることはできません。私は上記のようにクラスオブジェクトを作成するためにとにかくありますか? – Jaebum

+0

@ LeeJae私の答えで述べたように、ある種のポインタにboost :: thread_groupを格納する必要があります。私はshared_ptrを提案します。 – Lalaland

+0

[ここ](http://ideone.com/rb8qx)がその例です。 – Lalaland

関連する問題