2011-12-18 22 views
0

は、私は次のようにクラス階層を設定しようとしています:テンプレートと継承

template< class TProcess> 
class Path 
{ 
protected: 
    TProcess &process; 
    double Xt; 
public: 
    Path(TProcess &process, double X0) : process(process), Xt(X0) {} 
    virtual ~Path(){} 

    virtual double dX(double dt, const std::vector<double> &dW) = 0; 
}; 

template< class TProcess> 
class Process 
{ 
protected: 
    double X0; 
public: 
    Process(double X0) : X0(X0) {} 
    virtual ~Process(){} 

    virtual boost::shared_ptr<Path<TProcess> > NewPath() =0; 
}; 

をその後私はそれが動作するように、それは不可能サブクラスを宣言しました。私が試した:

class GeometricBrownianMotion; 
class GBMPath: public Path<GeometricBrownianMotion> 
{ 
    double dX(double dt, const std::vector<double> &dW) 
    { 
     Xt = Xt*exp(process.mu*dt - 0.5*dt + process.sigma*dW); 
     return Xt; 
    } 
}; 

class GeometricBrownianMotion: public Process<GeometricBrownianMotion> 
{ 
    double mu; 
    const std::vector<double> &sigma; 
    double sigma2; 
public: 
    GeometricBrownianMotion(double X0, double mu, const std::vector<double> &sigma): Process(X0), mu(mu), sigma(sigma), sigma2(sigma*sigma) 
    {} 

    virtual boost::shared_ptr<Path<GeometricBrownianMotion> > NewPath() 
    { 
     return boost::shared_ptr<Path<GeometricBrownianMotion> >(new GBMPath(*this, X0)); 
    } 

}; 

が、私は次のエラーを取得:

process.h:58: error: forward declaration of ‘struct GeometricBrownianMotion’ 
process.h:63: error: invalid use of incomplete type ‘struct GeometricBrownianMotion’ 

任意のアイデアはどのようにそれを動作させるためには?

答えて

3

実装をクラス定義から分離すれば、問題はほとんど自動的に消えてしまいます。

ほとんどの場合、テンプレートパラメータとして使用する前に、GeometricBrownianMotionという定義を移動したいと思うかもしれません。

編集:私のコンパイラでは、少なくともほぼすべてのインラインメソッド定義を削除するだけでコンパイルするのに十分でした。

+0

'GeometricBrownianMotion'と' GBMPath'からインラインメソッド定義を削除しますか? – Grzenio