2011-12-18 173 views
0

我试图建立的类层次结构如下:模板和继承在C++

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 2011-12-18 22:11:11