C++ 转换为右值后,线程参数必须是可开票的

C++ 转换为右值后,线程参数必须是可开票的,c++,C++,我目前正在尝试学习使用线程,但在向另一个线程中执行的函数传递参数时遇到了问题 void类::foocont string&a、size\u t b、Obj&c; 执行此函数的线程在类内声明 在最后一个例子中,我使用了文档中提到的std::ref,但仍然面临同样的编译错误 当我使用相同的原型在匿名命名空间中创建测试函数时,不会出现错误 在不同的线程中执行类方法是否有问题?怎么可能解决这个问题 以下是错误: /usr/include/c++/8/thread:120:17: error: stati

我目前正在尝试学习使用线程,但在向另一个线程中执行的函数传递参数时遇到了问题

void类::foocont string&a、size\u t b、Obj&c; 执行此函数的线程在类内声明

在最后一个例子中,我使用了文档中提到的std::ref,但仍然面临同样的编译错误

当我使用相同的原型在匿名命名空间中创建测试函数时,不会出现错误

在不同的线程中执行类方法是否有问题?怎么可能解决这个问题

以下是错误:

/usr/include/c++/8/thread:120:17: error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues
  static_assert( __is_invocable<typename decay<_Callable>::type,
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           typename decay<_Args>::type...>::value,
若在非静态成员上使用invoke,则必须传递类的实例,否则将接受另一个重载,该重载不会将第一个参数标识为可调用

 std::invoke(&Class::foo, instance_of_class, cref(charSet), b, ref(c) );
std::thread的情况也一样,其使用示例中甚至显示了这一点:

 foo f;
 
 std::thread t5(&foo::bar, &f);

我忘记将类对象作为参数传递。。。非常感谢大家

&类::foo,this,crefcharSet,b,refc
请将您的问题包括在内,以及您得到的实际错误,复制粘贴为文本!作为两个猜测,您是否记得将类对象作为第一个参数传递?你记得使用std::cref作为参数吗?我的灵力告诉我你忘记传递Class*或Class¶meter,指的是应该调用成员函数的对象。