我试图写一个解决非线性方程组的类(一个根查找器)。为此,我编写了一个类,它封装了所需的所有内部函数,以及要求解的系统:一个采用特征向量并返回特征的函数。公共newt
成员函数采用特征向量(初始猜测),使用该初始猜测运行算法,并返回特征向量r
,使得func(r) = {0, 0, ..., 0}
。我按照规定的here编写了函数:编写模板函数,实现MatrixBase
的实例化。
我处理任意函数解决的方法是实现一个基类,然后让用户扩展它,定义func
,即要解决的函数。我上课的是
class Newt {
private:
template<typename TR, typename T1, typename T2, typename T3>
tuple<TR,bool> lnsrch(const MatrixBase<T1> &xold, const double fold, const MatrixBase<T2> &g, MatrixBase<T3> &p, const double stepmax);
template <typename TR, typename T1, typename T2>
TR fdjac(const MatrixBase<T1> &x, const MatrixBase<T2> &fvec);
public:
template <typename TR, typename T1>
TR func(const MatrixBase<T1>&);
template <typename TR, typename T1>
tuple<TR,bool> newt(const MatrixBase<T1> &xx);
};
然后用户从Newt继承并将func
方法重写为所需的函数来解决:
struct NewtD : public Newt
{
template <typename T1, typename T2>
T1 func(const MatrixBase<T2> &z) {
// Content
}
};
然后他实例化它并调用newt成员函数。但是,当我使用以下测试用例编译它时:
struct Newt3 : public Newt
{
template <typename T1, typename T2>
T1 func(const MatrixBase<T2> &x) {
return (Vectord<3>() <<
z(0),
z(1)*z(2),
pow(z(2)-1,2)
).finished();
}
};
int main() {
Newt3 solver3;
bool check;
tie(X,check) = solver3.newt<Vectord<3>>(X);
}
使用g ++ 6.2.0
进行编译时出现以下链接器错误undefined reference to `std::tuple<Eigen::Matrix<double, 3, 1, 0, 3, 1>, bool> Newt::newt<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&)'
似乎无法找到newt
?我不知道为什么会这样,错误中的签名似乎与我的代码匹配,一切似乎都没问题。知道如何解决这个问题吗?
PS:哦,是的,我忘了:Vectord<N>
是一个简单定义为
template<size_t N>
using Vectord = Matrix<double, N, 1, 0>;
PPS:实现在一个单独的文件中。我没有包含它,因为它非常大,但底线是每个函数都在那里定义,包括Newt::newt
template <typename TR, typename T1>
tuple<TR,bool> Newt::newt(const MatrixBase<T1> &xx) {
// Body
}