首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定对象函数时c++异步错误

绑定对象函数时c++异步错误
EN

Stack Overflow用户
提问于 2018-01-12 07:26:10
回答 1查看 457关注 0票数 1

最近,我在绑定对象函数时封装了c++异步错误。在使用异步时,将测试正常的函数。但是,当我试图使用类作为参数绑定函数时,就会出现错误。以下是守则:

the class_asy.h

代码语言:javascript
复制
#ifndef CLASS_ASY_H_INCLUDE
#define CLASS_ASY_H_INCLUDE


#include <future> 

class A
{
public:
  A(int i_id):id(i_id) {}
  ~A(){}

  int id;

};



class B
{
public:
  B(int i_id):id(i_id) {}
  ~B(){}

  int id;

};

class C
{
public:
  C(){}
  ~C(){} 

  // a non-optimized way of checking for prime numbers:
  void multi_get(A& a, B& b);
  std::future<void> setup(A& a, B& b);

};
#endif

然后,它是class_asy.c:

代码语言:javascript
复制
// async example
#include <iostream>       // std::cout
#include <future>         // std::async, std::future
#include "class_asy.h"

using namespace std;


// a non-optimized way of checking for prime numbers:
void C::multi_get(A& a, B& b) {
  cout << "Calculating. Please, wait...\n";
  cout << a.id * b.id << endl;

}


std::future<void> C::setup(A& a, B& b)
{
    std::future<void> fut = std::async(launch::deferred, &C::multi_get, this, a,b);
    return fut;
}




int main ()
{

  A testa(2);
  B testb(3);
  C testc;
  std::future<void> fut = testc.setup(testa, testb);


  // call is_prime(313222313) asynchronously:
  // std::future<void> fut = std::async (launch::deferred, &C::multi_get, &testc, testa,testb);

  std::cout << "Checking for the result.\n";


  fut.wait();      

  // if (ret) std::cout << "It is prime!\n";
  // else std::cout << "It is not prime.\n";

  return 0;
}

整个错误消息如下:

代码语言:javascript
复制
@ubuntu:~/cpp_dynamic_invoke_success/stdasync_class_test$ bash compi.sh 
In file included from /usr/include/c++/4.8/future:38:0,
                 from class_asy.cpp:3:
/usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple<std::_Mem_fn<void (C::*)(A&, B&)>(C*, A, B)>’:
/usr/include/c++/4.8/future:1539:70:   required from ‘std::future<typename std::result_of<_Functor(_ArgTypes ...)>::type> std::async(std::launch, _Fn&&, _Args&& ...) [with _Fn = void (C::*)(A&, B&); _Args = {C* const, A&, B&}; typename std::result_of<_Functor(_ArgTypes ...)>::type = void]’
class_asy.cpp:19:82:   required from here
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (C::*)(A&, B&)>(C*, A, B)>’
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (C::*)(A&, B&)>(C*, A, B)>’
         _M_invoke(_Index_tuple<_Indices...>)

我找到了一种解决这个问题的方法,就是将引用的类类型修改为直接传递的类类型。

代码语言:javascript
复制
void multi_get(A& a, B& b); -> void multi_get(A a, B b);

但是,这不是一种有效的方法,因为整个对象只是被复制到函数中。我想知道是否有其他方法可以修复此错误,而不需要修改引用类的参数类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-12 07:29:44

问题是您不能将引用作为参数传递给使用std::asynch的函数(或者使用std::threadstd::bind等等)。您必须使用std::ref来包装引用参数:

代码语言:javascript
复制
std::async(launch::deferred, &C::multi_get, this, std::ref(a), std::ref(b));

考虑到被调用的函数不修改传递的参数,它可能应该使用const引用,在这种情况下必须使用std::cref

您也可以按值传递,如果实际结构的复制成本很高,则可以使用move语义。

最后,对于不产生结果的事情来说,有一个延迟的未来,并且只打印一些东西,这是没有什么意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48221474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档