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);

成员函数的第一个参数run(隐含在直接调用中)应该是this指针,即 just this。不要取消引用它。

当您取消引用时,一切都会崩溃,因为您的std::threadstd::mutex成员阻止您的类类型的对象是可复制的——这些成员对象的复制构造函数是private/ deleted,就是您看到的错误。

所以:

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

问题是这里的这一行:

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

通过取消引用它,您告诉编译器您想要将此对象的副本传递给线程函数。但是您的类不是可复制构造的,因为它包含 std::mutex 和 std::thread (两者都不是可复制构造的)。您得到的错误是因为这两个类的复制构造函数不可访问。

要修复它,请不要取消引用该对象。如果您仍然使用 lambda,代码可能会更清晰,如下所示:

t = thread([this] { run(); });
于 2013-01-11T19:47:40.630 回答