2013-05-30 75 views
-4

我正在創建一個自定義類pi2cma,並將另一個類的對象sigma作爲屬性。然而,當我試圖直接調用sigma的方法直接在pi2cmasigma.setMean(MN); cpp文件,我得到的錯誤:調用類屬性的方法C++

./src/pi2cma.cpp:54:7: error: ‘((pi2cma*)this)->pi2cma::sigma’ does not have class type

如果我然而,創建pi2cma的類,它完全是一箇中間方法同樣

void pi2cma::set_MN(Eigen::VectorXd _mean){sigma.setMean(_mean);}

沒有錯誤報道!

如何直接在我的pi2cma.cpp中使用父類sigma的方法?

編輯:包括pi2cma.cpp

#include "eigen_multivariate_normal.hpp" 
#include "pi2cma.hpp" 
#include <iostream> 
#include <cmath> 
#include <boost/random.hpp> 

//aditional libraries for multivariate matrix manipulation 
#include <boost/tr1/random.hpp> 
#include <Eigen/Dense> 
(...) 

pi2cma.hpp:

(...) 
// mean and covariance matrices 
Eigen::VectorXd MN; 
Eigen::MatrixXd CVM; 

// multivariate normal distribution 
Eigen::EigenMultivariateNormal<double,DIM> sigma(Eigen::VectorXd,Eigen::MatrixXd); 
(...) 

EigenMultivariteNormaleigen_multivariate_normal.hpp

template<typename Scalar, int Size> 
class EigenMultivariateNormal 
{ 
    Matrix<Scalar,Size,Size> _covar; 
    Matrix<Scalar,Size,Size> _transform; 
    Matrix< Scalar, Size, 1> _mean; 
    internal::scalar_normal_dist_op<Scalar> randN; // Gaussian functor 

public: 
    EigenMultivariateNormal(const Matrix<Scalar,Size,1>& mean,const Matrix<Scalar,Size,Size>& covar) 
    { 
    setMean(mean); 
    setCovar(covar); 
    } 

    void setMean(const Matrix<Scalar,Size,1>& mean) { _mean = mean; } 
    void setCovar(const Matrix<Scalar,Size,Size>& covar) { 
     _covar = covar; 
     SelfAdjointEigenSolver<Matrix<Scalar,Size,Size> > eigenSolver(_covar); 
     _transform = eigenSolver.eigenvectors()*eigenSolver.eigenvalues().cwiseMax(0).cwiseSqrt().asDiagonal(); 

    } 

    Matrix<Scalar,Size,-1> samples(int nn) 
    { 
    return (_transform * Matrix<Scalar,Size,-1>::NullaryExpr(Size,nn,randN)).colwise() + _mean; 
    } 
}; 

我在pi2cma.cpp我打電話:

void pi2cma::init(long init_exp){ 
(...) 
sigma.setMean(MN); // error 
set_MN(MN);  // works 
    (...) 
} 
+4

我的水晶球說錯誤在第42行。 –

+0

我說pi2cma.cpp的第一行缺少#include「sigma.h」 –

+2

顯示你的代碼的相關部分。 – interjay

回答

0

在你的代碼,sigma是一個函數:

Eigen::EigenMultivariateNormal<double,DIM> sigma(Eigen::VectorXd,Eigen::MatrixXd); 

你不能調用一個函數成員函數。

+0

我可以保證它不是一個函數。它是一個實現多元正態分佈的類。 – joaocandre

+0

@joaocandre它是您發佈的代碼中的函數聲明。 – juanchopanza

+0

然後在'pi2cma.hpp'中沒有正確聲明它。如何在不使用類構造函數的情況下將其聲明爲「EigenMultivariateNormal」類的對象? – joaocandre

0

在pi2cma.cpp

#include "sigma.h" 
+0

'sigma'不是類,是'eigen_multivariate_normal.hpp'文件中的類EigenMultivariateNormal的一個對象,我將其包含在'pi2cma.cpp'文件中 – joaocandre