Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将类对象传递到线程_C++_Multithreading - Fatal编程技术网

C++ 将类对象传递到线程

C++ 将类对象传递到线程,c++,multithreading,C++,Multithreading,简化的。我在网上找不到任何与此特定情况(传递到非成员线程函数中的类对象)匹配的内容。我尝试了一些建议(添加'&',std::ref(r),使用向量等),但我一直得到以下错误: void thread_func(Color& r) { // } void f() { Color r(red_state); thread t(thread_func, r); t.join(); } 错误:在'class std::result\u of'中没有名为'type'的类

简化的。我在网上找不到任何与此特定情况(传递到非成员线程函数中的类对象)匹配的内容。我尝试了一些建议(添加'&',std::ref(r),使用向量等),但我一直得到以下错误:

void thread_func(Color& r)
{
   //
}

void f()
{
   Color r(red_state);
   thread t(thread_func, r);
   t.join();
}
错误:在'class std::result\u of'中没有名为'type'的类型
错误:使用已删除的函数“Color::Color(const Color&)”

后者使我认为它与复制构造函数有关,但我认为通过引用传递它不应该影响这一点?任何提示或反馈都将不胜感激。

使用
std::ref
传递参考信息。即:

error: no type named 'type' in 'class std::result_of<void (*(Color*))(Color&)>'
error: use of deleted function 'Color::Color(const Color&)'

了解
std::reference\u wrapper
以了解原因:。

当您尝试将对象作为参数传递给函数时,您正在尝试按值传递它。 使用复杂对象而不是原语这样做,会导致C++调用复制构造函数,以便构造一个新对象,该对象是您通过的对象的副本。 使用reference执行此操作将产生相同的结果,正如您所看到的,它试图调用
Color::Color(const Color&)
,正如前面提到的,它已被删除

您可以尝试传递应该有效的
Color*
(指向
Color
)对象,但这意味着您将使用完全相同的对象,如果您不小心从两个不同的线程使用它,这可能会很危险。
您在第一个线程中对对象所做的每项更改都将应用于第二个线程。

谢谢您的警告。我来试一试。这段代码应该模拟那里发生的情况。注意复制构造函数被删除了。我不同意<代码>线程s构造函数通过转发引用来传递参数。在内部,它们被复制(需要复制ctor),并通过引用将副本传递给
thread_func
。在这种情况下没有应用传递值机制。引用只存在于编译时,一旦它需要将项传递到其他位置(不能在编译时),它就必须创建自己的对象副本(传递值本身)。那时候,按价值衡量并不重要。你关于调用copy-ctor的推理是错误的。按值传递机制需要复制(或移动)ctor,而按引用传递(这里就是这种情况)则不需要。@JMoore这里是最小的工作机制,啊,很有趣。我想这个错误一定在我班上的某个地方。。。这至少结束了这个问题。谢谢。@JMoore您的
Color
类很可能缺少一个复制构造函数。@AMA是的,但是如果使用了
std::ref
,OP的代码中不需要复制构造函数。它很可能是代码中未显示的某个地方所必需的。也许,在
thread\u func
body中,或者……下面一条评论中引用的AMA的例子是有效的。您可以添加您的功能,以找出它在哪里中断。显然,您的附加代码(此处未显示)使用复制构造,该构造将在
Color
类中删除。如果我们看不到完整的代码,我们无法告诉您原因。与第一个错误相同。线程的例程可能是一个lambda,它通过引用捕获对象。
thread t(thread_func, std::ref(r));