1

次のエラーが発生します

エラー2エラーC2248:'std :: thread :: thread':クラスで宣言されたプライベートメンバーにアクセスできません' std :: thread'c:\ dropbox \ prog \ c ++ \ ttest \ ttest \ main.cpp 11 1 ttest

エラー1エラーC2248:'std :: mutex :: mutex':クラスで宣言されたプライベートメンバーにアクセスできません' std :: mutex'c:\ dropbox \ prog \ c ++ \ ttest \ ttest \ main.cpp 11 1 ttest

私のコード

#include <mutex>
#include <thread>

using namespace std;

struct Serverbas
{
    mutex mut;
    thread t;
};

struct LoginServer : Serverbas
{
    void start()
    {
       t = thread(&LoginServer::run, *this);
    }
    void run() {}
};

int main() {}
4

2 に答える 2

4

問題はここにあるこの行です:

t = thread( &LoginServer::run, *this);

これを逆参照することにより、このオブジェクトのコピーをスレッド関数に渡したいことをコンパイラーに通知します。ただし、クラスにはstd::mutexとstd::threadが含まれているため(どちらもコピー構築可能ではありません)、コピー構築可能ではありません。発生するエラーは、これら2つのクラスのコピーコンストラクターにアクセスできないことが原因です。

これを修正するには、オブジェクトを逆参照しないでください。とにかくラムダを使用すると、コードはおそらくより明確になります。

t = thread([this] { run(); });
于 2013-01-11T19:47:40.630 に答える
4
t = thread( &LoginServer::run, *this);

メンバー関数への最初の引数run(直接呼び出しでは暗黙的)はthisポインター、つまり。だけである必要がありますthis。逆参照しないでください。

std::thread逆参照すると、クラスタイプのオブジェクトがコピー可能になるのをあなたとメンバーが妨げるため、すべての地獄が解き放たれますstd::mutex—これらのメンバーオブジェクトのコピーコンストラクターはprivate/ deletedであり、これがエラーです。

それで:

t = thread(&LoginServer::run, this);
于 2013-01-11T19:55:49.363 に答える