在类中初始化模板对象(c ++)

时间:2017-08-25 12:39:12

标签: c++ class templates eigen

我想根据Eigen库定义一个类:

头文件:

#include <Eigen>

using namespace Eigen;

class MatrixV{
    public:
        MatrixV(double mu, double omega, double delta, double size);
        Eigen::MatrixXd getV();
    private:
        Eigen::MatrixXd V;
        Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V, ComputeFullU | ComputeFullV);
};

CPP-文件:

MatrixV::MatrixV(double mu, double omega, double delta, double size){
    Eigen::MatrixXd V = MatrixXd::Random(3,3)
}

Eigen::MatrixXd MatrixV::getV(){
    return V;
}

通过编译该代码,我的编译器给了我以下错误:

MatrixV.h:14:68: error: 'V' is not a type
   Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V,ComputeFullU | ComputeFullV);

MatrixV.h:14:71: error: 'ComputeFullU' is not a type
   Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V, ComputeFullU | ComputeFullV);

MatrixV.h:14:84: error: expected ',' or '...' before '|' token
   Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V, ComputeFullU | ComputeFullV);
                                                                              So the main problem seems to be the line 
Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V, ComputeFullU | ComputeFullV);

但是我只是从http://eigen.tuxfamily.org/dox/classEigen_1_1JacobiSVD.html复制粘贴它,而且我也不明白为什么他希望()-brackets中的类型名称。你有什么想法?非常感谢!

1 个答案:

答案 0 :(得分:3)

您的错误消息:

MatrixV.h:14:68: error: 'V' is not a type
   Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V,ComputeFullU | ComputeFullV);

MatrixV.h:14:71: error: 'ComputeFullU' is not a type
   Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V, ComputeFullU | ComputeFullV);

MatrixV.h:14:84: error: expected ',' or '...' before '|' token
   Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd(V, ComputeFullU | ComputeFullV);

都是由同一问题引起的。编译器认为您正在声明一个函数,但看起来您想声明一个变量svd。你应该做的是删除括号,并将其移动到构造函数:

#include <Eigen>

using namespace Eigen;

class MatrixV{
    public:
        MatrixV(double mu, double omega, double delta, double size);
        Eigen::MatrixXd getV();
    private:
        Eigen::MatrixXd V;
        Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::NoQRPreconditioner> svd;
};

并更改构造函数:

MatrixV::MatrixV(double mu, double omega, double delta, double size) {
    V = MatrixXd::Random(3,3)
    svd.compute(V, ComputeFullU | ComputeFullV);
}