Шаблоны и наследование в C ++ - PullRequest
0 голосов
/ 19 декабря 2011

Я пытаюсь настроить иерархию классов следующим образом:

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’

Есть идеи, как заставить это работать?

1 Ответ

3 голосов
/ 19 декабря 2011

Просто отделите вашу реализацию от определений классов, и проблема исчезнет почти автоматически.

Почти, потому что вы можете просто захотеть переместить определение GeometricBrownianMotion перед использованием его в качестве параметра шаблона.

РЕДАКТИРОВАТЬ: даже не совсем, по крайней мере, на моем компиляторе, удаления всех встроенных определений методов было достаточно для его компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...