我从未使用过回调,但以下代码应该根据我的教授笔记工作。它不喜欢模板,并且有关于"高斯不能出现在常量表达式中"的错误。注意:GaussElim是一个函数对象(gauss(mx,vector)在以前的代码中工作)。
DirichletSolver 模板化回调函数:
template <class T, Vector<T> matrixAlgo(const AbstractMatrix<T>&, const Vector<T>)>
Vector<T> DirichletSolver::solve(const AbstractMatrix<T>& mx, const Vector<T> vect)
{
return matrixAlgo(mx, vect);
}
高斯运算符() 重载签名:
template <class T>
Vector<T> operator()(const AbstractMatrix<T>& mx, const Vector<T> vect);
和驱动程序代码:
GaussElim gauss;
DirichletSolver dir;
SymMatrix<double> mx;
Vector<double> vect;
...
dir.solve<gauss.operator()>(mx, vect);
我必须做什么才能让它工作?
它对我的函子有用吗?(我还有两个要实现)
solve
的第二个模板参数需要函数,而不是函子。特别是具有给定模板参数T
的签名Vector<T> ()(const AbstractMatrix<T>&, const Vector<T>)
的函数。
gauss.operator()
没有意义,也许你的意思是GaussElim::operator()
但这也不起作用,因为它是一个成员函数。如果您可以将GaussElim::operator()
的实现编写为自由函数,则可以将其用作模板参数:
template <class T>
Vector<T> myFunc(const AbstractMatrix<T>& mx, const Vector<T> vect)
{
// contents of GaussElim::operator()
}
然后用
dir.solve<double, myFunc>(mx, vect);