当前位置: 首页 > 知识库问答 >
问题:

为线程构造函数传递折射将其绑定到函数失败?

武睿
2023-03-14
#include <thread>
#include <vector>
#include <iostream>
using namespace std;

void fun(vector<int> & v) {
    v.push_back(13);
}

int main(){
    vector<int> v;
    thread t(fun, v);
    t.join();
    cout << v.size();
}

gcc 5.4.0错误示例:

在file include from/usr/include/c++/5/thread:39:0,from source_file.cpp:1:/usr/include/c++/5/functional:instantiation'struct std::_bind_simple))(std::vector&)>':/usr/include/c++/5/thread:137:59:required from'std::thread::thread(_callable&&,_args&&..)[with_callable=void(&)(std::vector&);

&}]'source_file.cpp:12:21:此处必需/usr/include/c++/5/function:1505:61:错误:在'class std::result_of)中没有名为'type'的类型)(std::vector&)>'typedef typename result_of<_callable(_args...)>::type result_type;^/usr/include/c++/5/function:1526:9:错误:在'class std::result_of)中没有名为'type'的类型

那么,1)C++在这个问题上的标准立场是什么;2)有没有办法解决这个问题(不传递指针,也不额外传递+1个lambda表达式作为包装器)?

共有1个答案

蓝华皓
2023-03-14

正如Galik在注释中指出的,您所需要的只是std::ref():

thread t(fun, std::ref(v));

为什么?

这是因为函数fun()需要引用lvalue。但是,当您构造Thread()时,将在新线程中传递参数的副本。不幸的是,在这种情况下,编译器将无法通过引用临时副本来实例化幕后的模板。

 类似资料:
  • 我正在尝试通过:如果流文件; 在我的主()中,到一个名为“FIFO”的类的构造函数:FIFO(文件); 在FIFO(FIFO.h)的头文件中,我有: 在FIFO.cc,我有: 我一直喜欢(还有更多,我只是粘贴其中一个): 在文件包括从/usr/lib/gcc/x86_64-redhat linux/4.4.7/…/…/…/…/包含/c /4.4.7/bits/localefwd.h: 43,从/u

  • 我试图将构造函数参数动态传递给Springboot框架中的一个bean。我已经使用context.getBean(class,arg...)在Spring中动态传递构造函数参数,但它没有成功获取值并显示默认值。我的代码有什么问题? 项目结构: 应用程序上下文.xml 应用 活动 输出:

  • Guice提供了一种使用toConstructor()方法与对象的特定构造函数创建绑定的方法。 @Override protected void configure() { try { bind(SpellChecker.class) .toConstructor(SpellCheckerImpl.class.getConstructor(String.clas

  • 我为什么要这样做?因为lambda表达式生成的ClosureType不是默认可构造的。通过这个“技巧”,我可以默认构造这样的closureType。 此外,模板参数的要求是,它必须为空=>

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回

  • 问题内容: 我的工厂如下 这是Foo的定义: 好。我不确定如何使用Guice将此参数传递给Foo构造函数? 有任何想法吗? 问题答案: 所有“ Guice构造函数参数”答案在某种程度上似乎都不完整。这是一个完整的解决方案,包括用法: //在实现类上注释构造函数和辅助参数 //使用仅接受辅助参数的create()方法创建工厂接口。 // FooFactory接口没有显式的实现类(Guice Magi