2017-08-25 4 views
2

Je veux denfine une classe basée sur la bibliothèque Eigen:Initialiser un objet de modèle dans une classe (C++)

fichier d'en-tête

:

#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-file:

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

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

En compilant ce code, mon compilateur me donne les erreurs suivantes:

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); 

mais je viens de copier-coller à partir de http://eigen.tuxfamily.org/dox/classEigen_1_1JacobiSVD.html et je ne comprends pas non plus pourquoi il s'attend à des noms de types dans les parenthèses() de toute façon. As tu des idées? Merci beaucoup!

+0

Il est une déclaration de méthode, vous devez mettre les types. Ce n'est pas un appel de fonction avec des paramètres. – Bentoy13

+1

Merci l'homme, qui a déjà beaucoup aidé. Savez-vous aussi, que faire avec le '|' jeton? – FuriousCpp

+0

@FuriousCpp La ligne verticale est l'opérateur Bit OU. – iBug

Répondre

3

Vos messages d'erreur:

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); 

sont tous causés par la même question. Le compilateur pense que vous déclarez une fonction, mais il semble que vous vouliez déclarer une variable svd. Ce que vous devez faire est de supprimer la parenthèse, et déplacez-le au constructeur:

#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; 
}; 

Et changer le constructeur:

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