最近,我在绑定对象函数时封装了c++异步错误。在使用异步时,将测试正常的函数。但是,当我试图使用类作为参数绑定函数时,就会出现错误。以下是守则:
the class_asy.h
#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:
// 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;
}整个错误消息如下:
@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...>)我找到了一种解决这个问题的方法,就是将引用的类类型修改为直接传递的类类型。
void multi_get(A& a, B& b); -> void multi_get(A a, B b);但是,这不是一种有效的方法,因为整个对象只是被复制到函数中。我想知道是否有其他方法可以修复此错误,而不需要修改引用类的参数类型。
发布于 2018-01-12 07:29:44
问题是您不能将引用作为参数传递给使用std::asynch的函数(或者使用std::thread或std::bind等等)。您必须使用std::ref来包装引用参数:
std::async(launch::deferred, &C::multi_get, this, std::ref(a), std::ref(b));考虑到被调用的函数不修改传递的参数,它可能应该使用const引用,在这种情况下必须使用std::cref。
您也可以按值传递,如果实际结构的复制成本很高,则可以使用move语义。
最后,对于不产生结果的事情来说,有一个延迟的未来,并且只打印一些东西,这是没有什么意义的。
https://stackoverflow.com/questions/48221474
复制相似问题