C++ 异步中没有匹配的函数(模板中的未解析类型)

C++ 异步中没有匹配的函数(模板中的未解析类型),c++,asynchronous,future,C++,Asynchronous,Future,我在重用名为evaluate template<typename T> template<typename T2> T2 Polynomial<T>::evaluate(T2 val) const { int degree = 0; return accumulate(coefs.begin(), coefs.end(), T2{0}, [&](T2 res, T coef){ return

我在重用名为
evaluate

template<typename T>
template<typename T2>
T2 Polynomial<T>::evaluate(T2 val) const {
    int degree = 0;
    return accumulate(coefs.begin(), coefs.end(), T2{0},
                      [&](T2 res, T coef){ return res+coef*pow(val,degree++);} );
}
重用“evaluate”函数会导致错误“no matching function” 在async中(模板中的未解析类型),因此我必须重新制作它

如何修复此错误? 我不明白期货有什么问题。向后推(async(launch::async,this->evaluate(val))

将根据
this->evaluate(val)
的结果进行计算并删除

和evaluate应该在
val
上调用,而不是
p

你应该这样做

std::bind(&Polynomial<T>::evaluate, p, val)
这将使用
p
val
作为参数,从
polymone::evaluate
创建一个可调用对象

将根据
this->evaluate(val)
的结果进行计算并删除

和evaluate应该在
val
上调用,而不是
p

你应该这样做

std::bind(&Polynomial<T>::evaluate, p, val)

这将从
polymone::evaluate
创建一个可调用对象,并将
p
val
作为参数

您应该更喜欢lambdas而不是
std::bind
,除非绝对必要。@Frank您有lambda的解决方案吗?@Tyker,将引用捕获lambda与异步一起使用是个坏主意。@Frank我同意,但在这种情况下,我们可以看到get,并且此时值仍在范围内。为什么要在
中为(poly)
调用
this->evaluate()
,也许应该是
[&]{return p.evaluate(val);}
p
对象调用evaluate。除非绝对必要,否则您应该更喜欢lambdas而不是
std::bind
。@Frank您有lambda的解决方案吗?@Tyker,将引用捕获lambda与异步一起使用是个坏主意。@Frank我同意,但在这种情况下,我们可以看到get,并且值在该点上仍然在范围内。为什么要在
中为(polys)
调用
this->evaluate()
,可能应该是
[&]{return p.evaluate(val);}
调用
p
对象的evaluate.i“think”您还遇到了经典的“template function在编译时不被视为模板”问题(如果无法编译您的代码,则很难判断)。
this->template evaluate(val);
是修复该问题的时髦语法(由@Tyker提出的问题仍然适用)@Frank我也会遇到同样的错误我“think”您还遇到了经典的“模板函数在编译时不被视为模板”问题(如果无法编译代码,很难说)<代码>此->模板评估(val)是一种时髦的语法,它修复了(由@Tyker提出的问题仍然适用)@Frank我也得到了同样的错误
std::bind(&Polynomial<T>::evaluate, p, val)
[&]{ return p.evaluate(val); }