链接器错误"未定义引用"具有Eigen模板功能

时间:2016-11-12 23:55:14

标签: c++ oop templates eigen

我试图写一个解决非线性方程组的类(一个根查找器)。为此,我编写了一个类,它封装了所需的所有内部函数,以及要求解的系统:一个采用特征向量并返回特征的函数。公共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
}

0 个答案:

没有答案