我从未使用回调,但以下代码应根据我教授的笔记工作。它不喜欢模板并且有关于&#34的错误;高斯不能出现在常量表达式中。" 注意:GaussElim是一个函数对象(高斯(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);
}
Gauss operator()重载签名:
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);
我需要做些什么才能让它发挥作用?
它对我的算子有用吗? (我还有两个要实施)
答案 0 :(得分:1)
solve
的第二个模板参数是期望一个函数,不是一个函子。特别是对于给定模板参数Vector<T> ()(const AbstractMatrix<T>&, const Vector<T>)
具有签名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);