1

我正在尝试创建一个以类作为模板的向量,该模板具有std::thread成员。但是,我不确定如何使用线程正确创建初始化列表。我目前拥有的是这样的:

class someclass 
{
public:
std::thread thread;
int id;

someclass(std::thread init_thread, int init_id) : 
    thread(&init_thread), 
    id(init_id)
{}
};

但是,当我尝试在 VS2012 中编译它时,出现以下错误:

f:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(1152): error C2064: term 不计算为采用 0 个参数的函数,该函数指向以下行:_VARIADIC_EXPAND_0X(_CLASS_BIND, , , , )

如果我从线程(&init_thread)初始化中删除 & 我会得到这些错误: 1>f:\users...\project\source.cpp(43): error C2248: 'std::thread::thread' :无法访问在类 'std::thread' 1> f:\program files (x86)\microsoft visual studio 11.0\vc\include\thread(73) 中声明的私有成员:参见 'std::thread::thread' 的声明1> f:\program files (x86)\microsoft visual studio 11.0\vc\include\thread(32) : 参见“std::thread”的声明

所以,我的问题是:我将如何正确创建这样一个初始化列表?

稍后在代码中我也执行以下操作(仅供参考......)

void function()
{
   // ....
   std::vector<someclass> v_someclass;
   v_someclass.push_back(someclass((std::thread(session, socket)),id));   
   // ....
}
4

1 回答 1

1

您的代码中有两个问题。最重要的是它std::thread不是可复制构造的,而只是可移动复制构造的。您可以通过将右值引用作为参数来明确此意图,并且std::move在构造线程数据成员时必须使用。其次,你不应该取参数的地址。您的数据成员不是指针。

someclass(std::thread&& init_thread, int init_id) : 
  thread(std::move(init_thread)), 
  id(init_id)

这意味着您只能someclass使用std::thread rvalue进行构造。例如

someclass sc0(std::thread(args), 42);
std::thread t(args);
someclass sc1(std::move(t), 42);

编辑请注意,您实际上可以有一个值参数:someclass(std::thread, int),但是传递左值时收到的错误消息不如使用右值引用参数得到的错误消息那么清晰。

于 2014-04-12T14:54:58.780 回答