1

私はこの問題を抱えておりboost::thread、解決することはできません。

私はclassX.hファイルを持っています:

#include <boost/thread/thread.hpp>
class classX{

    ...
    void startWork(void);
    void doWork(void);
    ...

}

次に.cppファイル:

...
void classX::startWork(){
boost::thread(&doWork);
}
void classX::doWork(){
...
}

私はコンパイルできません、私はエラーを取得します(私が行う行でboost::thread(&doWork)):

error C2761: 'void plsa_mt_2::doWork(void)' : member function redeclaration not allowed

このエラーはスレッドの作成に関連していますか、それとも他の何かに関連していますか?それを解決するために何ができますか?

4

2 に答える 2

2

はのclassX::doWork()メンバー関数であるため、へのポインターを指定せずclassXにメンバー関数ポインターを呼び出すことはできません。(&classX::doWork)classX

これを実現する最もブーストな方法は、Boost Bindを使用して、次のように、メンバー関数ポインターとclassXへのポインターを持つ呼び出し可能なファンクターを作成することです。

void classX::startWork() {
boost::thread t(boost::bind(&classX::doWork, this)); // be careful, the boost::thread will be destroyed when this function returns
}

:のインスタンスプロパティにアクセスする必要がないdoWork()場合は、静的メンバー関数またはグローバル関数を作成することもできます。doWork()classX

于 2012-06-10T11:56:23.303 に答える
1

まず、メンバー関数へのポインターを取得するための正しい構文は次のとおりです。

&classX::doWork

&doWorkただし、VSでの一般的なエラーは次のとおりであるため、エラーが発生する正確なコードが表示されない可能性があります。

error C2276: '&' : illegal operation on bound member function expression
于 2012-06-10T11:48:47.850 に答える