4

私は初心者の C++ プログラマーで、Linux マシンでプログラミングしています。

このエラーが発生しました:

cannot convert ‘void* (Network::*)(void*)’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)

それはこの行から来ています:

pthread_create(&thread_id,0,&Network::SocketHandler, (void*)csock );

私が呼び出そうとしている関数は次のとおりです。

void* Network::SocketHandler(void* lp)

ヘッダー ファイルで両方の関数をプライベートとして宣言しました。

私が間違っていることを知っている人はいますか?

4

2 に答える 2

6

通常の関数ポインターが必要な場所で、メンバー関数ポインターを使用しています。メンバー関数には、暗黙的な追加パラメーターがあります: . それを説明していません。thispthread_create

staticで使用できるように機能を作成する必要がありpthread_createます。次に、void*パラメーターを使用して、そうでなければthisポインターになるものを渡すことができます。

個人的には、 C++11を優先するか、 C++11実装にアクセスできない場合は、 pthreadsを捨てるだけです。 std::threadboost::thread

于 2013-01-11T22:53:44.677 に答える
2

編集: 関数で のインスタンスを使用しようとしていない場合はNetwork、K-ballo の答えが必要です。もしそうなら、読み進めてください。

pthread_create通常の関数が呼び出されることを期待しており、メンバー関数を非メンバー関数として使用しようとしています。メンバー関数は、呼び出し元のオブジェクトが必要なため、通常の関数ではありません。

Network::SocketHandleraを呼び出す関数を作成し、そのようにすることができますNetwork

void* call_sockethandler(void* nw) {
    Network* network = static_cast<Network*>(nw);

    void* result = network->SocketHandler(somearg);

    // do something w/ result

    return nullptr;
}

Network nw; // this can't go out of scope though
pthread_create(&thread_id, 0, call_sockethandler, &nw); 
于 2013-01-11T22:54:46.833 に答える